下降路径最小和【LC931】
给你一个
n x n的 方形 整数数组matrix,请你找出并返回通过matrix的下降路径 的 最小和 。下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置
(row, col)的下一个元素应当是(row + 1, col - 1)、(row + 1, col)或者(row + 1, col + 1)。
-
思路
dp,定义dp[i][j]dp[i][j]dp[i][j]为移动到该位置的最小和,那么答案为min(dp[n−1][j])min(dp[n-1][j])min(dp[n−1][j])
-
状态转移:
具体来说,位置
(row, col)的上一个元素应当是(row - 1, col - 1)、(row - 1, col)或者(row - 1, col + 1),因此
dp[i][j]=min(dp[i−1][j−1],dp[i−1][j],dp[i−1][j+1]) dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]) dp[i][j]=min(dp[i−1][j−1],dp[i−1][j],dp[i−1][j+1])
-
-
实现
- 转化为一维dp,使用变量记录dp[i−1][j−1]dp[i-1][j-1]dp[i−1][j−1]的值
- 为了方便边界处理,将dp数组左边增加一列,右边增加一列
class Solution { public int minFallingPathSum(int[][] matrix) { int n = matrix[0].length; if (n == 1) return matrix[0][0]; int[] dp = new int[n + 2]; System.arraycopy(matrix[0], 0, dp, 1, n); dp[0] = dp[n + 1] = Integer.MAX_VALUE; int res = Integer.MAX_VALUE; for (int i = 1; i < n; i++){ int pre = dp[0]; for (int j = 0; j < n; j++){ int tmp = pre; pre = dp[j + 1]; dp[j + 1] = Math.min(tmp, Math.min(dp[j + 1], dp[j + 2])) + matrix[i][j]; } } for (int j = 1; j <= n; j++){ res = Math.min(res, dp[j]); } return res; } }- 复杂度
- 时间复杂度:O(n2)\mathcal{O}(n^2)O(n2)
- 空间复杂度:O(n)\mathcal{O}(n)O(n)

文章描述了一个求解nxn整数矩阵中下降路径最小和的问题,采用动态规划方法,通过一维dp数组实现,时间复杂度为O(n^2),空间复杂度为O(n)。解决方案包括初始化dp数组,然后逐行更新最小和,最终返回最小路径和。
9775

被折叠的 条评论
为什么被折叠?



