leetcode 931

题目描述

931. 下降路径最小和

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

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

示例 1:

img

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

解题思路

  1. 二维dp

执行用时:5 ms, 在所有 Java 提交中击败了41.74%的用户

内存消耗:41.7 MB, 在所有 Java 提交中击败了79.21%的用户

通过测试用例:49 / 49

时间O(N*N)

空间 O(N*N)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public int minFallingPathSum(int[][] matrix) {
int m=matrix.length;
int n=matrix[0].length;
int [][]dp=new int[m][n];
for(int i=0;i<n;i++){
dp[0][i]=matrix[0][i];
}
for(int i=1;i<m;i++){
for(int j=0;j<n;j++){
int tmp=0;
if(j==0){
tmp=dp[i-1][j+1];
}
else if(j==n-1){
tmp=dp[i-1][j-1];
}
else{
tmp=Math.min(dp[i-1][j-1],dp[i-1][j+1]);
}
dp[i][j]=matrix[i][j]+Math.min(dp[i-1][j],tmp);
}
}
int ans=Integer.MAX_VALUE;
for(int i=0;i<n;i++){
ans=Math.min(ans,dp[m-1][i]);
}
return ans;


}
}
  1. 可以优化空间复杂度为O(N),因为每次只使用上一行的元素

leetcode 931
https://kkkkkong.github.io/posts/4008.html
作者
Kong Weichao
发布于
2023年4月19日
许可协议