列表

详情


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
解释:如图所示,为和最小的下降路径

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int minFallingPathSum(vector<vector<int>>& matrix) { } };

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])

上一题