一、题意
给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。
下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。
二、解法
解法:
动态规划
当前位置的最小和由上面三个位置之中的最小和+当前位置的值决定,
d
p
[
i
]
[
j
]
=
m
i
n
{
d
p
[
i
−
1
]
[
j
−
1
]
,
d
p
[
i
−
1
]
[
j
]
,
d
p
[
i
−
1
]
[
j
+
1
]
}
+
m
a
t
r
i
x
[
i
]
[
j
]
dp[i][j]=min\{dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]\}+matrix[i][j]
dp[i][j]=min{dp[i−1][j−1],dp[i−1][j],dp[i−1][j+1]}+matrix[i][j]
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
O
(
1
)
O(1)
O(1)
三、代码
解法:
int minFallingPathSum(vector<vector<int>>& matrix) {
int n =matrix.size();
for(int i=0;i<n-1;i++){
for(int j=0;j<n;j++){
int v = matrix[i][j];
if(j>0){
v=min(v,matrix[i][j-1]);
}
if(j<n-1){
v=min(v,matrix[i][j+1]);
}
matrix[i+1][j]=v+matrix[i+1][j];
}
}
int minS = matrix[n-1][0];
for(int i=1;i<n;i++){
minS =min(minS,matrix[n-1][i]);
}
return minS;
}
四、总结
这一题不难,主要要厘清上下关系,如何进行状态转移,dp数组可以直接用原数组进行操作。
五、引用
[1] leetcode:931. Minimum Falling Path Sum
[2] leetcode:931. Minimum Falling Path Sum官方解法