【LeetCode】120. Triangle

120. Triangle

介绍

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.

解答

采用动态规划的方法,可以解决这个问题。

自上而下的顺序来计算结果。

对于当前行,如果我们直到从三角形定点到达上行的每个元素的最小路径值,我们就可以很简单的得到当前行的最小路径值。

当前行的最小路径值等于上行中邻近中两个结点的最小路径中的最小值和三角形中当前结点之和。

注意当前行的第0个元素的最小路径和当前行的最后一个元素的最小路径需要特殊处理。

为节省空间,我们可以只用O(n)的空间来完成功能。假设vector help(triangle.back().size(),0)。

第一行的最小路径和就是其元素值自身。

从第二行开始,我们计算每行的最小路径和右最后一个元素开始,往前计算,这样子就不会覆盖原有的值。

class Solution {
public:
    //自上而下
    int minimumTotal(vector<vector<int>>& triangle) {
        vector<int> help(triangle.back().size(),0);
        help[0] = triangle[0][0];
        for(int i = 1; i < triangle.size(); ++i)
        {
            help[i] = help[i-1] + triangle[i][i];
            for(int j = i-1; j > 0; --j)
                help[j] = min(help[j],help[j-1]) + triangle[i][j];
            help[0] = help[0] + triangle[i][0];
        }
        int res = INT_MAX;
        for(auto val:help)
        {
            res = min(res,val);
        }
        return res;
    }
};

自下而上

同样是动态规划方法。但是这次是从最后一行开始,依次计算从当前结点到达最后一行的最小路径。

class Solution {
public:
    //自下而上
    int minimumTotal(vector<vector<int> > &triangle) {
        int n = triangle.size();
        vector<int> minlen(triangle.back());
        for (int layer = n-2; layer >= 0; layer--) // For each layer
        {
            for (int i = 0; i <= layer; i++) // Check its every 'node'
            {
                // Find the lesser of its two children, and sum the current value in the triangle with it.
                minlen[i] = min(minlen[i], minlen[i+1]) + triangle[layer][i]; 
            }
        }
        return minlen[0];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值