力扣---931. 下降路径最小和

发布时间 2023-07-13 10:21:54作者: Owlwu

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

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

 

示例 1:

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

示例 2:

输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:如图所示,为和最小的下降路径

 

提示:

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


当前位置的最小值,等于上面相应位置左中右三处的最小值加当前位置的数字,取最小值。

class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int len = matrix[0].length;
        // 只需要上一层的最小值,不需要之前的值,所以用一维数组省空间。
        int[] dp = new int[len];
        // Arrays 类中的 copyof 方法,实际上也是调用的 System.arraycopy() 方法,但速度会慢得多。
        System.arraycopy(matrix[0], 0, dp, 0, len);
        for (int i = 1; i < len; i ++) {
            int[] temArr = new int[len];
            Arrays.fill(temArr, Integer.MAX_VALUE);
            for (int j = 0; j < len; j++) {
                for (int k = -1; k < 2; k ++) {
                    // 考虑边界条件。
                    if (j + k >= 0 && j + k < len) {
                        temArr[j] = Math.min(temArr[j], matrix[i][j] + dp[j + k]);
                    }
                }
            }
            dp = temArr;
        }
        int res = Integer.MAX_VALUE;
        for (int x : dp) {
            res = Math.min(res, x);
        }
        return res;
    }
}