【LeetCode】解题120:Triangle

这是一个关于LeetCode问题120的解题报告,内容涉及动态规划算法。题目要求找到三角形从顶部到底部的最小路径和,每一步只能移动到下一行相邻的数字。解决方案使用O(n)额外空间实现,通过动态规划计算每一层的最小路径,并返回最后一层的最小值。

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

Problem 120: Triangle [Medium]

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.

来源:LeetCode

解题思路

本题使用动态规划思想,与题解119:Pascal’s Triangle II类似。
题中要求只使用 O ( n ) O(n) O(n)的额外空间,按动规的思想,只需保存一个长度为 n n n的数组,每一层计算时从后往前计算,minlist(j)只需要用到上一层的minlist(j)和minlist(j-1),而且修改minlist(j)后不会影响到minlist(j-1)的计算,因此只需要 O ( n ) O(n) O(n)的空间即可。
公式为:
m i n l i s t ( j ) = { m i n l i s t ( j ) + t r i a n g l e ( i , 0 ) j = 0 ; m i n l i s t ( j − 1 ) + t r i a n g l e ( i , i ) j = i ; min ⁡ { m i n l i s t ( j − 1 ) , m i n l i s t ( j ) } + t r i a n g l e ( i , j ) o t h e r w i s e . minlist(j) = \begin{cases} minlist(j) + triangle(i,0) & j = 0;\\ minlist(j-1) + triangle(i,i) & j = i;\\ \min\{minlist(j-1), minlist(j)\} + triangle(i,j) & otherwise. \end{cases} minlist(j)=minlist(j)+triangle(i,0)minlist(j1)+triangle(i,i)min{minlist(j1),minlist(j)}+triangle(i,j)j=0;j=i;otherwise.
其中, i i i代表层数, m i n l i s t ( j ) minlist(j) minlist(j)代表到达第 j j j个数的最小路径,数组 m i n l i s t minlist minlist的更新是in-place的。
最后计算出第n层后,只需返回minlist中的最小值。

运行结果:
在这里插入图片描述
要点:动态规划

Solution (Java)

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int N = triangle.size();
        int[] minlist = new int[N];
        minlist[0] = triangle.get(0).get(0);
        for(int i = 1; i < N; i++){
            minlist[i] = minlist[i-1] + triangle.get(i).get(i);
            for(int j = i-1; j > 0; j--){
                minlist[j] = Math.min(minlist[j], minlist[j-1]) + triangle.get(i).get(j);
            }
            minlist[0] = minlist[0] + triangle.get(i).get(0);
        }
        return Arrays.stream(minlist).min().getAsInt();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值