本人新手为了面试互联网公司,将刷题做一个记录以及总结,方便之后学习!!
第11道问题 剑指offer 13 为一道中等题
随着题目难度的加深,解题的时间明显增多,效果理想度变低。
题目
力扣https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/
1.自己思路
这道题与12题相似,不同的是那个题需要回溯,也就是说不可能得情况下需要将原来的值变为初始状态。而本问题只需要遍历即可。之前一直回溯没做出来,参考题解得到最终结果。
class Solution {
public int movingCount(int m, int n, int k) {
int res =0;
boolean[][] visited = new boolean[m][n];
res = deal(0,0,m,n,visited,k);
return res;
}
public int deal(int i,int j,int m,int n,boolean[][] visited,int k){
if(i<0||i>=m ||j<0||j>=n ||visited[i][j]||count(i,j)>k){
return 0;
}
visited[i][j]=true;//确保走过了,就不在查找了
//此题应该遍历整个表格,当不满足就往下走,因此走过了不需要再回溯为false;
int number=deal(i+1,j,m,n,visited,k) +deal(i-1,j,m,n,visited,k)
+deal(i,j+1,m,n,visited,k) +deal(i,j-1,m,n,visited,k)+1;//没走过一个空格设置+1
return number;
}
public int count(int i,int j){
//从题中分析,ij最大100,也就是说方格的下标最多99,也就是两位数
//取个位%10,取10位 /10 若大于100 取十位 (a/10)%10
return (i%10 +i/10) +(j%10 +j/10);
}
}
其实这道题输出number可以不再函数中迭代容易出错,那个1很容易遗漏,做了好多次都没有成功,最后参考答案才得到结果。
还有另一种思路,每一次不输出,最后遍历下visited看有多少个true即可。感觉容易理解。
class Solution {
public int movingCount(int m, int n, int k) {
int res =0;
boolean[][] visited = new boolean[m][n];
deal(0,0,m,n,visited,k);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(visited[i][j]==true){
res++;
}
}
}
return res;
}
public void deal(int i,int j,int m,int n,boolean[][] visited,int k){
if(i<0||i>=m ||j<0||j>=n ||visited[i][j]||count(i,j)>k){
return ;
}
visited[i][j]=true;//确保走过了,就不在查找了
//此题应该遍历整个表格,当不满足就往下走,因此走过了不需要再回溯为false;
deal(i+1,j,m,n,visited,k) ;
deal(i-1,j,m,n,visited,k);
deal(i,j+1,m,n,visited,k) ;
deal(i,j-1,m,n,visited,k);//没走过一个空格设置+1
}
public int count(int i,int j){
//从题中分析,ij最大100,也就是说方格的下标最多99
return (i%10 +i/10) +(j%10 +j/10);
}
结果:
总结:
1.这个题需要遍历整个表格,不需要回溯。
2.最后遍历输出虽然效果差点,但容易理解。