class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix) {
}
};
931. 下降路径最小和
给你一个 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
原站题解
golang 解法, 执行用时: 8 ms, 内存消耗: 5.2 MB, 提交时间: 2022-11-27 12:28:48
func minFallingPathSum(A [][]int) int { for i := 1 ; i < len(A) ; i++{ for j := 0 ; j < len(A) ; j ++{ minN := A[i-1][j] if j > 0 { minN = min(minN,A[i-1][j-1]) } if j < len(A[j]) - 1 { minN = min(minN,A[i-1][j+1]) } A[i][j] = minN+A[i][j] } } res := A[len(A)-1][0] for j := 1 ; j < len(A) ; j++{ res = min(res,A[len(A)-1][j]) } return res } func min(a,b int) int{ if a < b { return a } return b }
golang 解法, 执行用时: 12 ms, 内存消耗: 5.2 MB, 提交时间: 2022-11-27 12:28:22
const inf int = 0x3f3f3f func minFallingPathSum(matrix [][]int) int { m, n := len(matrix), len(matrix[0]) dp := make([][]int, 2) dp[0], dp[1] = make([]int, n), make([]int, n) for i, v := range matrix[0] { dp[0][i] = v dp[1][i] = inf } for i := 1; i < m; i++ { for j := 0; j < n; j++ { dp[i&1][j] = inf for k := -1; k <= 1; k++ { if nj := j + k; nj >= 0 && nj < n { dp[i&1][j] = min(dp[i&1][j], dp[(i-1)&1][nj]) } } dp[i&1][j] += matrix[i][j] } } return minV(dp[(m-1)&1]) } func min(a, b int) int { if a < b { return a } return b } func minV(vals []int) int { ans := vals[0] for _, v := range vals { if v < ans { ans = v } } return ans }
python3 解法, 执行用时: 72 ms, 内存消耗: 15.3 MB, 提交时间: 2022-11-27 12:23:18
class Solution(object): def minFallingPathSum(self, A): while len(A) >= 2: row = A.pop() for i in range(len(row)): A[-1][i] += min(row[max(0,i-1): min(len(row), i+2)]) return min(A[0])