leetcode 120. Triangle(三角形)

Leetcode 120 Triangle 三角形最小路径和 给出一个三角形(数据数组),找出从上往下的最小路径和。每一步只能移动到下一行中的相邻结点上。空间复杂度要求O(n)。 阅读详情

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).

给出一个三角形,从顶端走向底端,经过路径的最短数字和是多少,每次只能走向相邻的数字。
原题是一个金字塔形的三角形,写成数组形式就变成了上述形状。

比如2可以走到3,4,3可以走向6,5
也就是说上一行j列到下一行可以走到j或者j+1
反之,j列的上一行可以是j或者j-1

思路:
每一行都求出上一行的数加下来的和,加的时候第j列的数选择上一行j和j-1中较小的相加
到最后一行求完后选择最小的那个值

(1) 二维DP

    public int minimumTotal(List<List<Integer>> triangle) {
        if(triangle == null || triangle.size() == 0) {
            return 0;
        }
        
        int n = triangle.size();
        //每行的元素数=行数,所以n行n列,补一行
        int[][] dp = new int[n+1][n+1];
        //后面用到取dp的min,所以先填上最大值
        for(int i = 0; i <= n; i++) {
            Arrays.fill(dp[i], Integer.MAX_VALUE);
        }
        
        for(int i = 1; i <= n; i++) {
            //第i行元素只到i
            for(int j = 1; j <= i; j++) {
                dp[i][j] = triangle.get(i-1).get(j-1);
                //第一行不需要和上一行相加,直接填入元素,不需要后续处理
                if(i == 1 && j == 1) {
                    continue;
                }
                //边界条件
                if(j == 1) {
                    dp[i][j] += dp[i-1][j];
                } else if(j == i) {
                    dp[i][j] += dp[i-1][j-1];
                } else {
                    dp[i][j] += Math.min(dp[i-1][j], dp[i-1][j-1]);
                }
            }
        }
        //array中的最大元素,java8
        return Arrays.stream(dp[n]).min().getAsInt();
        
    }

(2) 一维DP
因为每次只需要知道上一行的数,还需要保存当前行的数,因此只需要2行的dp数组

每次用dp[1][j]来求当前行的和,然后和dp的0行对换,作为下一次求dp[1]时的参考

c++中有简单的行对换的swap函数,还有求一行最小值的min_element函数
min_element返回iterator,所以用解引用操作符得到数值

    int minimumTotal(vector<vector<int>>& triangle) {
        int n = triangle.size();
        
        vector<vector<int>> dp(2, vector<int>(n, INT_MAX));
        
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                dp[1][j] = triangle[i][j];
                if (i == 0 && j == 0) {
                    continue;
                }
                
                if (j == 0) {
                    dp[1][j] += dp[0][j];
                } else if(j == i) {
                    dp[1][j] += dp[0][j - 1];
                } else {
                    dp[1][j] += min(dp[0][j - 1], dp[0][j]);
                }               
            }
            std::swap(dp[0], dp[1]);
        }
        
        return *std::min_element(dp[0].cbegin(), dp[0].cend());
    }

Java版

    public int minimumTotal(List<List<Integer>> triangle) {
        if(triangle == null || triangle.size() == 0) {
            return 0;
        }
        
        int n = triangle.size();
        //每行的元素数=行数,所以n行n列,补一行
        int[][] dp = new int[2][n];
        //后面用到取dp的min,所以先填上最大值
        for(int i = 0; i <= 1; i++) {
            Arrays.fill(dp[i], Integer.MAX_VALUE);
        }
        
        for(int i = 0; i < n; i++) {
            //第i行元素只到i
            for(int j = 0; j <= i; j++) {
                dp[1][j] = triangle.get(i).get(j);
                //第一行不需要和上一行相加,直接填入元素,不需要后续处理
                if(i == 0 && j == 0) {
                    continue;
                }
                //边界条件
                if(j == 0) {
                    dp[1][j] += dp[0][j];
                } else if(j == i) {
                    dp[1][j] += dp[0][j-1];
                } else {
                    dp[1][j] += Math.min(dp[0][j], dp[0][j-1]);
                }
            }
            swapArr(dp[0], dp[1]);
        }
        //array中的最大元素,java8
        //每次dp[1]中运算完之后要翻转到dp[0],因此最后看的是dp[0]
        return Arrays.stream(dp[0]).min().getAsInt();
        
    }
    
    public void swapArr(int[] arr1, int[] arr2) {
        //假设同一长度
        for(int i = 0; i < arr1.length; i++) {
            int tmp = arr1[i];
            arr1[i] = arr2[i];
            arr2[i] = tmp;
        }
    }
别再让PyCharm吃光你的C盘!保姆级教程:安全迁移config、plugins和remote sources到D盘 本文提供了一份详细的PyCharm配置与缓存文件迁移指南,帮助开发者将config、plugins和remote sources等占用大量C盘空间的文件安全转移到D盘。通过修改data.properties文件和正确迁移顺序,确保PyCharm功能不受影响,同时释放宝贵的系统盘空间。 阅读详情

相关推荐

数据分析—用户行为数据分析

一般价值用户(R高F高M低):用户处于购买活跃期,感兴趣的商品多,购买次数少 → 针对该部分客户,目的就是要让他们购买,所以可以和运营部门沟通,降低利润,给出有力折扣促进购买,进而转为重要价值用户。重要价值用户(R高F高M高)维护:用户处于购买活跃期,感兴趣的商品多,购买次数也多 → 针对兴趣产品,保持一定频率的触达,持续维护。

m0_74091312的博客 1421

Leetcode 120. Triangle 三角形问题(动态规划经典) 解题报告

1 解题报告首先我承认我很二哈,这道题我明明已经做过了,但是刚刚不知道为什么又去做了一遍,而且我查了下两次的解法还有所差别(貌似是现在的版本有进步了呢)问题就是一个三角形的数组,求从顶部到下方的最短路径。。这个问题是太过经典+Easy的DP问题了,哈哈。。不想多讲,直接看吧PS:其实这道题倒着从底部到顶部也可以2 原题Given a triangle, find the minimum path s

MebiuW的专栏 1309

Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框架构思

最近因为工作原因需要使用Qt开发一个类似于Visio的流程图组件,需满足基本的流程图功能,图元类型可自定义扩展,不同图元存有各类自定义数据,可以保存为xml文件,可以读取xml文件生成流程图等等。

qq_43793182的博客 1万+

Leecode(62)3024.三角形类型-简单

由于任意两边之和都大于第三边,所以可以构成一个三角形,因为三条边的长度互不相等,所以返回 "scalene"。nums[0] + nums[1] = 3 + 4 = 7 ,大于 nums[2] = 5。nums[0] + nums[2] = 3 + 5 = 8 ,大于 nums[1] = 4。nums[1] + nums[2] = 4 + 5 = 9 ,大于 nums[0] = 3。由于三条边长度相等,所以可以构成一个等边三角形,返回 "equilateral"。,需要用它们来构造三角形。

qq_51999844的博客 462

微信自动化必备软件:inspect(获取微信界面元素)

SaveButton10015.2:1 ✅(合格)Passed ✅说明这个控件完全符合无障碍标准。

Ven%的博客 1385

matlab中的神经网络怎么用,matlab怎么搭建神经网络

图中 yi表示神经元i的输出,函数f称为激活函数 ( Activation Function )或转移函数 ( Transfer Function ) ,net称为净激活(net activation)。图中x1~xn是从其他神经元传来的输入信号,wij表示表示从神经元j到神经元i的连接权值,θ表示一个阈值 ( threshold ),或称为偏置( bias )。对于P,x1是行向量,x2是行向量。双极S形函数与S形函数主要区别在于函数的值域,双极S形函数值域是(-1,1),而S形函数值域是(0,1)。

wenangou的博客 6364

LeetCode 120——三角形最小路径和

1. 题目 2. 解答 详细解答方案可参考北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分。 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的较小值然后再加上当前元素,即可得出从某一位置到最下边的最小路径和。以此类推,我们就可以求出最上边元素的最小路径和。过程如下所示: 2 3 4 6 5 7 4 1 8...

weixin_30649641的博客 386

Deepseek 10分钟化身理性荐股神器:触碰程序员不敢想的天花板

在这个消息疯狂、波动频繁的市场,“理性”两字显得弥足珍贵。通过Deepseek+AkShare+Aktools+Dify四位一体的方案,能帮我们降低信息搜集成本,并在短期投资领域搭建出一套“可解释、低门槛、易定制”的量化荐股流程。不要再盲目听小道消息或依赖情绪驱动,不妨给自己一个机会,让数据说话。而要注意的是,“理性荐股”并非万能,它只是工具,最终的收益还得依赖投资者自身对风险和机遇的权衡。祝大家都能在这股市里收获理性的底气,寻得更精准的入场时机。

qqxdh的博客 3755

LeetCode 611. 有效三角形的个数

a = 4, b = 6, c = 9,a + b > c,成立,因为在a到b这个区间中,a此时是最小的,而数据又是单调递增 (有序的),因此,在 a 和 b 中间的值就不需要再判断了,此时一定可以和 b = 6,c = 9 构成三角形,因此,此时可以构成三角形的个数:b的下标 - a 的下标,b向左移动。而 a + c > b 和 b + c > a 不需要判断,因为此时c是最大的数据,最大的数据加上一个非负数,一定大于另外的一个数据,比如,a + c 是一定大于 b 的。2,3,4 (使用第一个4)

m0_62229058的博客 1560

手把手教你用Simulink搭建交流异步电机矢量控制模型(附完整仿真文件)

本文详细介绍了如何使用Simulink搭建交流异步电机矢量控制模型,涵盖系统架构设计、关键模块实现、PI调节器参数整定及仿真分析等核心内容。通过实战指南和完整仿真文件,帮助读者掌握矢量控制技术,提升电机控制系统的设计与调试能力。

n4o5p6q7r的博客 252

避开这5个坑!STC8H DMA串口通信的实战避坑指南(115200波特率实测)

本文深入解析了STC8H单片机利用DMA实现稳定全双工串口通信的实战要点。针对115200高波特率场景,详细拆解了DMA-UART架构、关键寄存器配置、时钟精度计算、缓冲区管理及中断协同等核心环节,并提供了具体的避坑指南和调试方法,帮助开发者构建高效可靠的通信链路。

melon的博客 675

leetcode: 三角形的组成个数

leetcode: 三边组成三角形的可能组合

weixin_41221717的博客 1064

仿真学习系列(四十一):Sigrity仿真之PDN阻抗提取

电源分配网络(Power Distribution Network,简称PDN)是电子系统中至关重要的部分,主要用于将电源从电源输入端传输到各个组件。PDN的设计质量直接影响到系统的电源完整性和信号稳定性,尤其是在高速设计中,PDN的阻抗特性对电源噪声、地弹(ground bounce)和电源完整性(Power Integrity,简称PI)具有重要影响。

案例文章,高速信号 1136

【Leetcode】120. 三角形(Triangle)

Leetcode - 120 Triangle (Medium) 题目描述:给定一个三角形形状的集合,从上到下依次向邻接位置移动,求移动的最小路径和。 [ [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). ...

厉兵秣码 300

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【LeetCode 面试经典150题】120. Triangle 三角形

Given a triangle array, return the minimum path sum from top to bottom.For each step, you may move to an adjacent number of the row below. More formally, if you are on index on the current row, you may move to either index or index on the next row.给定一个三

qq_43513394的博客 538

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LeetCode 120. Triangle(三角形)

原题网址:https://leetcode.com/problems/triangle/ 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

James Pan 903

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LeetCode120 Triangle 三角形

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...

李歇特冯-兹拜因巴哈的博客 230

Leetcode 120. Triangle 三角形最小路径和

题目:给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。说明:如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。解题思路:动态规划...

zhangzhetaojj的博客 411

三角形最小路径和(Triangle)java_leetcode120

三角形最小路径和(Triangle)java_leetcode120 题目 给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。 说明: 如果你可以只使用 O(n) 的额...

下雨了_简的博客 684

Leetcode-120_Triangle(三角形)—动态规划解法+记忆化搜索解法-【C++】

Leetcode 120. Triangle(三角形) 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...

老陈聊架构 822

leetcode 120 Triangle 三角形最小路径和 python 动规

所有Leetcode题目不定期汇总在 Github, 欢迎大家批评指正,讨论交流。 ''' 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 fol...

Jasmine_dream 357

LeetCode 120. Triangle三角形最小路径和 (C++)

题目: 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], ...

weixin_34198762的博客 221

LeetCode(120):三角形最小路径和 Triangle(Java)

2019.12.22 LeetCode 从零单刷个人笔记整理(持续更新) github:https://github.com/ChopinXBP/LeetCode-Babel 自底向上的动态规划。建立dp数组,dp[j]代表当前层j位置的最小路径和,对于每一层i,自底向上有动态转移方程: dp[j] = triangle.get(i - 1).get(j) + Math.min(dp[j], d...

NJU_ChopinXBP的博客 357

Leetcode 120.三角形最小路径和(Triangle)

Leetcode 120.三角形最小路径和 1 题目描述(Leetcode题目链接)   给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。   说明:如果你可以只使用 O(n) 的额外空...

qq_39378221的博客 206

[LeetCode 120] - 三角形(Triangle)

问题 给出一个三角形,找出从顶部至底部的最小路径和。每一步你只能移动到下一行的邻接数字。 例如,给出如下三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 从顶部至底部的最小路径和为11(即2+3+5+1=11)。 注意: 加分项-如果你能只使用O(n)的额外空间,n为三角形中的总行数。 初始思路 最直接的思路...

weixin_30245867的博客 208

LeetCode : 120. Triangle三角形最短路径

试题: 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,...

心之所向 366
上一篇: leetcode 115. Distinct Subsequences
下一篇: leetcode 121. Best Time to Buy and Sell Stock
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值