LeetCode 120 Triangle

本文介绍了一种求解从三角形顶部到底部的最小路径和的问题,通过自下而上的动态规划方法实现,仅使用O(n)额外空间。文中详细解析了算法思路,并提供了核心代码实现。

摘要生成于 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

这里写图片描述

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.

分析

定义一个数组K,自下向上存储结果,当处理到第一行时,K[0]就是结果。

在本题中,数组K分别是:

[7, 6, 10, 3]
[9, 10, 10, 3]
[11, 10, 10, 3]

存储结果的部分是:

[7, 6, 10]
[9, 10]
[11]

分析数字7,是题目输入的第三行的6,与其下面相邻的4和1的组合,取最小值;
分析数字9,是题目输入的第二行的3,与数组[7, 6, 10]中的7和6的组合,取最小值。

核心代码是:

        for (int i = s.length - 2; i >= 0; i--) {
            List<Integer> list = triangle.get(i);
            for (int j = 0; j <= i; j++) {
                s[j] = list.get(j) + Math.min(s[j], s[j + 1]);
            }
        }

代码

    public static int minimumTotal(List<List<Integer>> triangle) {

        int size = triangle.size();

        if (size == 0) {
            return 0;
        }

        if (size == 1) {
            return triangle.get(0).get(0);
        }

        int[] s = new int[size];

        int k = 0;
        for (Integer v : triangle.get(size - 1)) {
            s[k++] = v;
        }

        for (int i = s.length - 2; i >= 0; i--) {
            List<Integer> list = triangle.get(i);
            for (int j = 0; j <= i; j++) {
                s[j] = list.get(j) + Math.min(s[j], s[j + 1]);
            }
        }

        return s[0];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值