931 下降路径最小和-中等

题目:

给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。

分析:

自底向上递推,注意求边界条件。

只有一列时,求所有行的和;只有一行时,求行内最小值。

// date 2023/11/13
func minFallingPathSum(matrix [][]int) int {
    m := len(matrix)
    if m == 0 {
        return 0
    }
    res := 0
    if m == 1 {
        for j := 0; j < len(matrix[0]); j++ {
            if j == 0 {
                res = matrix[0][0]
            } else {
                res = xy(res, matrix[0][j])
            }
        }
        return res
    }

    n := len(matrix[0])
    if n == 1 {
        res = 0
        for i := 0; i < m; i++ {
            res += matrix[i][0]
        }
        return res
    }

    for i := m-2; i >= 0; i-- {
        for j := 0; j < n; j++ {
            if j > 0 && j+1 < n {
                matrix[i][j] += min(matrix[i+1][j-1], matrix[i+1][j], matrix[i+1][j+1])
            } else if j > 0 {
                matrix[i][j] += xy(matrix[i+1][j-1], matrix[i+1][j])
            } else if j + 1 < n {
                matrix[i][j] += xy(matrix[i+1][j], matrix[i+1][j+1])
            }
            if i == 0 {
                if j == 0 {
                    res = matrix[0][0]
                    continue
                } else if j > 0 {
                    res = xy(res, matrix[i][j])
                }
            }
        }
    }

    return res
}

func min(x, y, z int) int {
    return xy(xy(x, y), z)
}

func xy(x, y int) int {
    if x < y {
        return x
    }
    return y
}

最后更新于