这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战
题目
给你一个 的 方形 整数数组 matrix
,请你找出并返回通过 matrix
的下降路径 的 最小和 。
下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col)
的下一个元素应当是 (row + 1, col - 1)
、(row + 1, col)
或者 (row + 1, col + 1)
。
示例
输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:下面是两条和最小的下降路径,用加粗+斜体标注:
[[2,1,3], [[2,1,3],
[6,5,4], [6,5,4],
[7,8,9]] [7,8,9]]
输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:下面是一条和最小的下降路径,用加粗+斜体标注:
[[-19,57],
[-40,-5]]
输入: matrix = [[-48]]
输出: -48
提示
n == matrix.length
n == matrix[i].length
1 <= n <= 100
-100 <= matrix[i][j] <= 100
解题思路
要求得下降路径的最小和,那么我们可以通过拿到上一行对应位置的最小值来进行推导,得到当前位置的最小和。
对应位置:(row - 1, col - 1)
、(row - 1, col)
、(row - 1, col + 1)
代码实现
方式一:动态规划
class Solution {
public int minFallingPathSum(int[][] matrix) {
int n = matrix.length;
if(1 == n){
return matrix[0][0];
}
// 初始化
int[][] dp = new int[n][n];
for(int i = 0; i < n; ++i){
dp[0][i] = matrix[0][i];
}
// 遍历后续行的元素
for(int i = 1; i < n; ++i){
for(int j = 0; j < n; ++j){
// 获取当前位置的路径最小和
dp[i][j] = getMin(dp, i, j) + matrix[i][j];
}
}
// 遍历末行,得到最短路径
int res = Integer.MAX_VALUE;
for(int i = 0; i < n; ++i){
res = Math.min(res, dp[n - 1][i]);
}
// 返回结果
return res;
}
// 获取上一行对应位置的最小和
private int getMin(int[][] dp, int i, int j){
// 左边界判断
if(j == 0){
return Math.min(dp[i - 1][j], dp[i - 1][j + 1]);
// 右边界判断
}else if(j == dp.length - 1){
return Math.min(dp[i - 1][j], dp[i - 1][j - 1]);
// 中间判断
}else{
return Math.min(Math.min(dp[i - 1][j], dp[i - 1][j + 1]), dp[i - 1][j - 1]);
}
}
}
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!