120. 三角形最小路径和

题目描述:


给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

相邻的结点 :*在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。*

例如,给定三角形:


[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

解题思路:

使用反向思维,确定当前每一层最小的路径的值为:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]


lastNum 的长度为 triangle 里最后一个元素的长度即可 ;
i 为 垂直坐标 , j 为水平坐标从0开始
当 i = 1 时:
lastNum : 2 + 3 , 2 + 4 ;

当 i = 2 时:
lastNum : 2 + 3 + 6 , min(2+3 ,2+4) + 5 , 2 + 4 + 7 ;

当 i = 3 时:

lastNum : 2 + 3 + 6 + 4 , min(lastNum[j] , lastNum[j - 1]) + 1 |(j = 1) , min(lastNum[j] , lastNum[j - 1]) + 8|(j = 2) , 2 + 4 + 6 + 3 ;

循环结束标志: i < triangle.size() ;
然后找到 lastNum 数组里的最小值即为所求的结果 。

注意:lastNum 求值得时候,j 要从大到小开始计算,免得数据被更新。
在这里插入图片描述

代码实现:

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        if (triangle.size() == 0)
            return 0 ;
        int len = triangle.back().size() ;
        int i , j ;
        /*for(vector<int> tmp : triangle)
            len = len > tmp.size() ? len : tmp.size() ;*/
        vector<int> lastSum(len , 0) ;
        for (i = 0 ; i < triangle.front().size() ; i ++)
            lastSum[i] = triangle[0][i] ;
        
        for (i = 1 ; i < triangle.size() ; i ++)
        {
            lastSum[triangle[i - 1].size()] = triangle[i][triangle[i - 1].size()] + lastSum[triangle[i - 1].size() - 1];
            for (j = triangle[i - 1].size() - 1 ; j > 0 ; j --)
                lastSum[j] = triangle[i][j] + (lastSum[j - 1] > lastSum[j] ? lastSum[j] : lastSum[j - 1]) ;
            lastSum[0] = triangle[i][0] + lastSum[0] ;
            
        }
        int ret = lastSum[0] ;
        for (i = 1 ; i < len ; i ++)
            ret = ret > lastSum[i] ? lastSum[i] : ret ;
        return ret ;
    }
};

代码复杂度:

时间复杂度为(O(triangle元素的个数) * O(triangle元素的子元素的个数));
空间复杂度为O(triangle子元素最多的) ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值