2020年7月14日打卡

没做出来买卖股票 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;
    }

看了一点书,但是看的实在不多也没总结出啥,今天先不写里

你可能感兴趣的:(日常打卡)