120. Triangle

本文介绍了一种使用动态规划解决三角形最小路径和问题的方法。该问题要求从三角形顶部走到底部,每一步只能移动到下一行相邻的数字,目标是找到路径上的数字之和最小的路线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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[i][j]=min(dp[i-1][j],dp[i-1][j+1])+trangle[i][j];注意只有一个元素和0个元素的情况。

这样子的时间复杂度和空间复杂度都是O(n^2)。

代码:

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

第二种解法大体上和第一种差不多,但是降低了空间复杂度。

但是很巧妙。用一个数组sum,初始化为最底层各个数的值,每计算一次就更新一次。

代码:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值