刷题LeetCode 剑指offer13

本人新手为了面试互联网公司,将刷题做一个记录以及总结,方便之后学习!!

第11道问题 剑指offer 13 为一道中等题

随着题目难度的加深,解题的时间明显增多,效果理想度变低。

题目

力扣icon-default.png?t=L892https://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.最后遍历输出虽然效果差点,但容易理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值