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), 需要创建与矩阵相同的空间.
结果如下所示.
Comments | 0 条评论