美文网首页悦目娱心算法
931. 下降路径最小和

931. 下降路径最小和

作者: 红树_ | 来源:发表于2023-07-12 16:07 被阅读0次

对自己好一点,心情不好的时候,什么都别考虑,去吃自己爱吃的吧。

LC每日一题,参考931. 下降路径最小和

题目

给你一个 n x n方形 整数数组 matrix ,请你找出并返回通过 matrix下降路径 **的 最小和

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)(row + 1, col) 或者 (row + 1, col + 1)

输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:如图所示,为和最小的两条下降路径

解题思路

  • 记忆化搜索:最容易想到的就是以第一行每个元素开始递归往下找三个分支,每个分支继续递归找三个分支直到最后一行,然后使用记忆化搜索减少重复计算。
  • 动态规划:也可反向思考,定义动态规划方程,每行每个元素都有对应的当前最小路径,计算所有最小路径,最后一行的所有最小路径的最小值即为结果。

记忆化搜索

不使用记忆化搜索时间复杂度O(3^n)会超时.

class Solution {
    int[][] memo;
    public int minFallingPathSum(int[][] matrix) {
        //枚举每一行 下一行从三个数里面找值最小的
        int n = matrix.length, ans = Integer.MAX_VALUE;
        //记忆化搜索
        memo = new int[n][n];
        for(int i = 0; i < n; i++) Arrays.fill(memo[i],Integer.MAX_VALUE);
        for(int i = 0; i < n; i++) {
            ans = Math.min(ans,dfs(matrix,0,i));
        }
        return ans;
    }
    int dfs(int[][] matrix,int row,int col) {
        int n = matrix.length, res = Integer.MAX_VALUE;
        if(row == n) return 0;
        if(memo[row][col] != Integer.MAX_VALUE) return memo[row][col];
        if(col-1 >= 0) res = Math.min(res,dfs(matrix,row+1,col-1));
        res = Math.min(res,dfs(matrix,row+1,col));
        if(col+1 < n) res = Math.min(res,dfs(matrix,row+1,col+1));
        return memo[row][col] = matrix[row][col] + res;
    }
}

复杂度分析

  • 时间复杂度:O(n^2)n为矩阵行/列数,记忆化搜索搜索状态个数n^2,单个状态只会计算一次。
  • 空间复杂度:O(n^2),记忆数组空间n^2

动态规划

对于第二行每个元素的最小路径和与正上一行正上方三个元素有关,其他行同理.

class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int n = matrix.length,ans = Integer.MAX_VALUE;
        //动态规划dp[i][j] 表示到达i,j坐标时的最小路径和
        int[][] dp = new int[n][n];
        //转移方程 
        for(int i = 0; i < n; i++) dp[0][i] = matrix[0][i];
        for(int i = 1; i < n; i++) {
            for(int j = 0; j < n; j++) {
                //从正上方三个元素选最小
                int res = dp[i-1][j];
                if(j > 0) res = Math.min(res,dp[i-1][j-1]);
                if(j+1 < n) res = Math.min(res,dp[i-1][j+1]);
                dp[i][j] = res + matrix[i][j];
            }
        }
        for(int i = 0; i < n; i++) ans = Math.min(ans,dp[n-1][i]);
        return ans;
    }
}

复杂度分析

  • 时间复杂度:O(n^2),双重循环遍历。
  • 空间复杂度:O(n^2),动态规划记忆数组空间n^2

相关文章

  • LeetCode 931. 下降路径最小和

    1、题目 931. 下降路径最小和 2、题解 定义一个保存状态的二维数组,第一行初始化为A[0],接着剩下行满足状...

  • LeetCode 931. 下降路径最小和

    1、题目 2、分析 方法一:递归主要就是找出dp函数。这个 dp 函数的含义:从第一行(matrix[0][..]...

  • 931. 下降路径最小和(Python)

    难度:★★★☆☆类型:数组方法:动态规划 题目 力扣链接请移步本题传送门[https://leetcode-cn....

  • # LeetCode 931. 最小下降路径之和

    问题 问题描述:给定一个方形整形数组A(行数 == 列数),计算出最小的下降路径之和。 下降路径可从第一行的任意一...

  • 【35】下降路径最小和

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimu...

  • LeetCode #1289 Minimum Falling P

    1289 Minimum Falling Path Sum II 下降路径最小和 II Description:...

  • LeetCode-931-下降路径最小和

    解题思路: dp[i][j]表示走到(i-1, j-1)点时的路径和,其状态由上一行的j-1、j、j+1列转移而来...

  • 图的最短路径算法(Dijkstra和Floyd)

    最短路径和最小生成树的区别:最短路径解决的是如何求解各顶点之间的路径权值和最小的问题。最小生成树是保证图的所有路径...

  • 最小路径和

    LintCode题目地址 给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。

  • 最小路径和

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每...

网友评论

    本文标题:931. 下降路径最小和

    本文链接:https://www.haomeiwen.com/subject/xudpudtx.html