首页 > 其他 > 详细

Triangle - LeetCode

时间:2019-04-01 20:37:46      阅读:142      评论:0      收藏:0      [点我收藏+]

题目链接

Triangle - LeetCode

注意点

  • 树是以vector的形式给出
  • 贪心算法只能给出局部最优解而不是全局最优解,所以要用dp算法

解法

解法一:以triangle本身为dp数组,状态转移方程为triangle[i][j] = min(triangle[i - 1][j - 1], triangle[i - 1][j]) + triangle[i[j],而位于边界的结点则是直接加上上一层的值。

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int i,j,size = triangle.size();
        if(size < 1) return 0;
        for(i = 1;i < size;i++)
        {
            int len = triangle[i].size();
            for(j = 0;j < len;j++)
            {
                if(j == 0) triangle[i][j] += triangle[i-1][j];
                else if(j == len-1) triangle[i][j] += triangle[i-1][j-1];
                else triangle[i][j] += min(triangle[i-1][j-1],triangle[i-1][j]);
            }
        }
        return *min_element(triangle[size-1].begin(),triangle[size-1].end());
    }
};

技术分享图片

解法二:解法一虽然不用开辟新的空间,但是修改了原数组。可以复制三角形最后一行,作为用来更新的一维数组,然后逐个遍历这个DP数组,对于每个数字,和它之后的元素比较选择较小的再加上面一行相邻位置的元素做为新的元素,然后一层一层的向上扫描。

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int i,j,size = triangle.size();
        vector<int> dp(triangle[size-1]);
        for(i = size-2;i >= 0;i--)
        {
            for(j = 0;j <= i;j++)
            {
                dp[j] = min(dp[j],dp[j+1])+triangle[i][j];
            }
        }
        return dp[0];
    }
};

技术分享图片

小结

Triangle - LeetCode

原文:https://www.cnblogs.com/multhree/p/10638639.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!