力扣刷题笔记《动态规划篇》→ 931. 下降路径最小和

234 阅读1分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

题目

给你一个 n×nn \times 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
解释:下面是两条和最小的下降路径,用加粗+斜体标注:
[[2,1,3],      [[2,1,3],
 [6,5,4],       [6,5,4],
 [7,8,9]]       [7,8,9]]
 
 输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:下面是一条和最小的下降路径,用加粗+斜体标注:
[[-19,57],
 [-40,-5]]

输入: matrix = [[-48]]
输出: -48

提示

  • n == matrix.length
  • n == matrix[i].length
  • 1 <= n <= 100
  • -100 <= matrix[i][j] <= 100

解题思路

要求得下降路径的最小和,那么我们可以通过拿到上一行对应位置的最小值来进行推导,得到当前位置的最小和。

对应位置:(row - 1, col - 1)(row - 1, col)(row - 1, col + 1)

代码实现

方式一:动态规划

class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int n = matrix.length;
        if(1 == n){
            return matrix[0][0];
        }
        // 初始化
        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){
                // 获取当前位置的路径最小和
                dp[i][j] = getMin(dp, i, j) + matrix[i][j];
            }
        }

        // 遍历末行,得到最短路径
        int res = Integer.MAX_VALUE;
        for(int i = 0; i < n; ++i){
            res = Math.min(res, dp[n - 1][i]);
        }

        // 返回结果
        return res;
    }

    // 获取上一行对应位置的最小和
    private int getMin(int[][] dp, int i, int j){
        // 左边界判断
        if(j == 0){
            return Math.min(dp[i - 1][j], dp[i - 1][j + 1]);
        // 右边界判断
        }else if(j == dp.length - 1){
            return Math.min(dp[i - 1][j], dp[i - 1][j - 1]);
        // 中间判断
        }else{
            return Math.min(Math.min(dp[i - 1][j], dp[i - 1][j + 1]), dp[i - 1][j - 1]);
        }
    }
}

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!

题目出处:leetcode-cn.com/problems/lo…