欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

动力扣每日一题 2024/3/16 矩阵中的最大移动次数

最编程 2024-03-19 16:36:10
...

前言:首先这个系列不一定会连续更新下去 也许会断更 目前只打算更新每日一题的easy和medium难度 会逐步讲解每一行代码的思路

题目描述

用例说明

思路讲解

最外层遍历:将第一列的每一个元素看作一次遍历的起点(初始值)

返回值是移动的最大次数 用ans来存储

很容易想到用深度优先搜索 dfs内的参数是什么呢?首先得有横纵坐标,以及整个二维矩阵,ans可以定义为全局变量,不必再加入dfs内。

dfs内的处理逻辑:首先需要更新ans,ans的值和横坐标取最大值 最大不超过矩阵的长度

dfs的本质是递归 递归的出口就是当走到矩阵右边界的时候 即ans==grid[0].length-1

dfs(i,0,gird)是指从(i,0)坐标开始找符合位置条件的且值比他大的下一个元素

由于走动的格子受到方向的限制,只能走右上,右下和右,所有在遍历的时候需要对始末位置取最大最小值,最小不能小于0,最大不能大于数组列的长度

当前节点深度优先搜索之后需要将其中的值置0表示已经访问过了

代码

class Solution {
    int ans;
    public int maxMoves(int[][] grid) {
      for(int i=0;i<grid.length;i++){
        dfs(i,0,grid);
      }
      return ans;
    }
    public void dfs(int i,int j,int[][] grid){
        ans=Math.max(ans,j);
        if(ans==grid[0].length-1){
            return;
        }
        for(int k=Math.max(i-1,0);k<Math.min(i+2,grid.length);k++){
            if(grid[k][j+1]>grid[i][j]){
                dfs(k,j+1,grid);
            }
        }
        grid[i][j]=0;
    }
}

复杂度

时间复杂度O(mn)

空间复杂度O(n)