LeetCode120 Triangle

给定一个三角形,找到从顶部到底部的最小路径和。每一步可以移动到下一行的相邻数字。例如,给定三角形[[2],[3,4],[6,5,7],[4,1,8,3]],最小路径和为11。要求只使用O(n)额外空间解决此问题。" 86646176,5528951,Docker Hub:如何上传本地镜像,"['Docker', '镜像管理', 'Docker Hub', '容器部署', '版本控制']
摘要由CSDN通过智能技术生成

【问题描述】
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.
【问题分析】
从下至上 DP即可
【算法设计】

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

【算法分析】
实际上可以不必使用二维向量来存储,使用一维向量逐层覆盖即可。

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle)  {
        vector<int> mini = triangle[triangle.size()-1]; //初始化最后一行
        for(int i=triangle.size()-2; i>=0; i--)
        {
            for(int j=0; j<triangle[i].size(); j++)
            {
                mini[j] = triangle[i][j] +  min(mini[j] , mini[j+1]);
            }
        }
        return mini[0];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值