leetcode算法931. 下降路径最小和

91 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情

一、题目描述:

931. 下降路径最小和

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

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

示例 1:

image.png

输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:如图所示,为和最小的两条下降路径

示例 2:

image.png

输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:如图所示,为和最小的下降路径

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 100
  • -100 <= matrix[i][j] <= 100

二、思路分析:

自底向上看,对于每层每个元素来说,当前位置最小值等于下层的最小值加当前位置的最小值,用一个temp数组保存上一层计算得到的每个位置的值,再用一个数组根据temp数组中每个位置的最小值计算出当前位置的最小值,每计算完一层就将当前层元素拷贝给temp数组,计算完最后一层直接跳出循环返回结果数组中的最小值即可

三、AC 代码:

class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int[] temp = new int[matrix.length + 1];
        int[] dp = new int[matrix.length];
        for (int i = matrix.length - 1; i >= 0; i--) {
            for (int j = 0; j < matrix[i].length; j++) {
                if (j == 0) {
                    dp[j] = Math.min(temp[j], temp[j + 1]) + matrix[i][j];
                } else if (j == matrix[i].length - 1) {
                    dp[j] = Math.min(temp[j], temp[j - 1]) + matrix[i][j];
                } else {   
                    dp[j] = Math.min(Math.min(temp[j - 1], temp[j]), temp[j + 1]) + matrix[i][j];
                }
            }
            if (i == 0) {
                break;
            }
            System.arraycopy(dp, 0, temp, 0, dp.length);
        }
        Arrays.sort(dp);
        return dp[0];
    }
}

范文参考:

931.下降路径最小和(中等):C语言 动态规划 - 下降路径最小和 - 力扣(LeetCode) (leetcode-cn.com)