1289. 下降路径最小和 II

难度: 困难
来源: 每日一题 2023.08.10

给你一个 n x n 整数矩阵 grid ,请你返回 非零偏移下降路径 数字和的最小值。

非零偏移下降路径 定义为:从 grid 数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列。

示例 1:

输入:grid = [[1,2,3],[4,5,6],[7,8,9]]
输出:13
解释:
所有非零偏移下降路径包括:
[1,5,9], [1,5,7], [1,6,7], [1,6,8],
[2,4,8], [2,4,9], [2,6,7], [2,6,8],
[3,4,8], [3,4,9], [3,5,7], [3,5,9]
下降路径中数字和最小的是 [1,5,7] ,所以答案是 13 。

示例 2:

输入:grid = [[7]]
输出:7

提示:

  • n == grid.length == grid[i].length
  • 1 <= n <= 200
  • -99 <= grid[i][j] <= 99
class Solution {
    public int minFallingPathSum(int[][] grid) {

    }
}

分析与题解


  • 动态规划 + 模拟法

    这个题目和先前的 931. 下降路径最小和 非常类似, 不过 931. 下降路径最小和 是上一层左右两个元素, 如下图所示.

    但是这个题目是只要不是当前列的元素即可, 也就是选择项会变为 m - 1 项. 如下图所示.

    但是整体的思路没有发生改变, 状态转移方程可为如下所示.

    dp[i][j] = Math.min(dp[i-1][0], .... ,dp[i-1][lenght - 1]); + grid[i][j];
    

    在 i = 0 时, 我们需要初始化dp的值, 如下所示.

    dp[i][j] = grid[i][j];
    

    在最后一行时, 我们需要比较大小,得出最小路径的值.

    if (i == grid.length - 1) {
        // 最后一组比较大小
        minSum = Math.min(minSum, dp[i][j]);
    } 
    

    整体逻辑代码如下所示.

    class Solution {
        public int minFallingPathSum(int[][] grid) {
            // 二维数组,因为我们需知道前一行的最小值情况
            int[][] dp =  new int[grid.length][grid[0].length];
            int minSum = Integer.MAX_VALUE;
            for(int i = 0; i < grid.length; i++) {
                for(int j = 0; j < grid[i].length; j++) {
                    if (i == 0) {
                        // 初始化dp
                        dp[i][j] = grid[i][j];
                    } else {
                        // 判断前一行最小值
                        int lastMin = Integer.MAX_VALUE;
                        for(int z = 0; z < grid[i - 1].length; z++) {
                            if (z != j) {
                                lastMin = Math.min(lastMin, dp[i-1][z]);
                            }
                        }
                        dp[i][j] = lastMin + grid[i][j];
                    }
                    if (i == grid.length - 1) {
                        // 最后一组比较大小
                        minSum = Math.min(minSum, dp[i][j]);
                    } 
                }
            }
            return minSum;
        }
    }
    

    复杂度分析:

    • 时间复杂度: O(n^3), 三次遍历循环嵌套, 时间复杂度与数组长度相关.
    • 空间复杂度: O(mn), 需要创建与矩阵相同的空间.

    结果如下所示.


IT界无底坑洞栋主 欢迎加Q骚扰:676758285