leetcode 120.Triangle-杨辉三角形|动态规划

本文介绍了一种使用动态规划解决三角形最小路径和问题的方法。通过从下往上的递归处理方式,有效地找到了从顶部到底部的最小路径和。并对比了另一种深度优先搜索递归方法在大数据量情况下的不足。

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

原题链接:120. Triangle
【思路】
与以往处理杨辉三角形的方式不同,本题是从下往上递归处理。建立一个 dp 数组,每一行的最小和。以[[2],[3,4],[5,6,7]]为例,dp 的过程如下:

public class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int[] dp = new int[triangle.size()+1];
        for(int i = triangle.size() - 1; i >= 0; i--)
            for(int j = 0; j < triangle.get(i).size(); j++)
                dp[j] = Math.min(dp[j], dp[j+1]) + triangle.get(i).get(j);
        return dp[0];
    }
}
43 / 43 test cases passed. Runtime:  5 ms  Your runtime beats 56.63% of javasubmissions.

【补充】

同样的动归,采用深度优先,很容易想到用递归法,但是这种方法在数据量很大时超时了:

    public int minimumTotal(List<List<Integer>> triangle) {
        return findMinPath(triangle, 0, Integer.MAX_VALUE, 0, 0);
    }
    public int findMinPath(List<List<Integer>> triangle, int curSum, int min, int index, int level) {
        curSum += triangle.get(level).get(index);
        if (level == triangle.size() - 1)
            return Math.min(min, curSum);
        return Math.min(findMinPath(triangle, curSum, min, index, level + 1),
                findMinPath(triangle, curSum, min, index + 1, level + 1));
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值