没做出来买卖股票 III ,不知道会鸽到什么时候
Leetcode 120. 三角形最小路径和
题目
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
很容易看出来是一个动态规划,而且状态转移方程也比较简单:
f[i][j]=min(f[i−1][j−1],f[i−1][j])+c[i][j]
本题可采用 O(n2) 或 O(n) 的空间复杂度,O(n2) 就是再创建一个二维数组,O(n) 是直接创建一个长度为 原数组高度(同时也等于原数组最长元素长度)的数组,直接在里面覆盖式更新就行,不过每一层的遍历方式要变成倒着遍历。
自己比较懒,直接原地修改了原数组,这种方法不可取:
int minimumTotal(vector<vector<int>>& triangle) {
if(triangle.size() == 1){
return triangle[0][0];
}else if(triangle.size() <= 0){
return 0;
}
int min = 1e9;
for(int i = 1; i < triangle.size(); i++){
for(int j = 0; j < triangle[i].size(); j++){
if(j == 0){
triangle[i][j] += triangle[i-1][j];
}else if(j == triangle[i].size() - 1){
triangle[i][j] += triangle[i-1][j-1];
}else{
triangle[i][j] += (triangle[i-1][j-1] < triangle[i-1][j] ? triangle[i-1][j-1] : triangle[i-1][j]);
}
if(i == triangle.size() - 1){
min = min < triangle[i][j] ? min : triangle[i][j];
}
}
}
return min;
}
看了一点书,但是看的实在不多也没总结出啥,今天先不写里