leetcode 剑指 Offer 13. 机器人的运动范围

Posted 一个拿着底层薪资操着架构师的心的码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 剑指 Offer 13. 机器人的运动范围相关的知识,希望对你有一定的参考价值。

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

示例 1:

输入:m = 2, n = 3, k = 1
输出:3

示例 2:

输入:m = 3, n = 1, k = 0
输出:1

提示:

1 <= n,m <= 100
0 <= k <= 20

思路:

dfs每次遍历四个方向,没有越界且行列数字之和小于等于k则递归遍历它,否则跳过

 1 class Solution {
 2 
 3     // 获取数字的数位之和
 4     public int getSumOfBit(int a){
 5         int sum = 0;
 6         while(a != 0){
 7             sum += a % 10;
 8             a /= 10;
 9         }
10         return sum;
11     }
12 
13     public boolean[][] vis; // 判断是否遍历过
14     public int m, n, k;     // 记录m,n,k,减少变量传递的开销
15     public int cnt = 0; // 计数器,记录能到达的格子数量
16 
17     public int movingCount(int m, int n, int k) {
18 
19         vis = new boolean[m][n];
20         this.m = m;
21         this.n = n;
22         this.k = k;
23 
24         // dfs遍历
25         dfs(0, 0);
26 
27         return cnt;
28     }
29 
30     public int[][] dir = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
31 
32     public void dfs(int row, int col){
33         vis[row][col] = true;
34         cnt++;
35         // 每次遍历四个方向,没有越界且行列数字之和小于等于k则递归遍历它,否则跳过
36         for(int i = 0; i < 4; i++){
37             int newRow = row + dir[i][0];
38             int newCol = col + dir[i][1];
39             if(newRow <m && newRow >= 0 && newCol < n && newCol >= 0 
40             && (getSumOfBit(newRow) + getSumOfBit(newCol)) <= k && vis[newRow][newCol] == false){
41                 dfs(newRow, newCol);
42             }
43         }
44     }
45 }

leetcode运行时间为2ms, 空间为35.4MB

复杂度分析:

时间复杂度:每个单元格最多被遍历一次,最坏情况下遍历所有单元格,所以时间复杂度为O(n*m)

空间复杂度:需要一个大小为n*m的 vis[][]数组记录单元格是否被访问过,递归也会有一个递归栈的复杂度,最大深度为max(m, n), 所以空间复杂度为O(n*m + max(m,n))

以上是关于leetcode 剑指 Offer 13. 机器人的运动范围的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-剑指Offer 13机器人运动

LeetCode剑指offer记录

剑指OFFER----试题13. 机器人的运动范围

剑指 Offer 13. 机器人的运动范围

剑指 Offer 13. 机器人的运动范围 重刷

算法---- Leetcode剑指offer-Java版题解