开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情
一、题目描述:
给你一个 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
二、思路分析:
自底向上看,对于每层每个元素来说,当前位置最小值等于下层的最小值加当前位置的最小值,用一个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)