返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现LeetCode(120.三角形)
  • 607
分享到

C++实现LeetCode(120.三角形)

2024-04-02 19:04:59 607人浏览 泡泡鱼
摘要

[LeetCode] 120.Triangle 三角形 Given a triangle, find the minimum path sum from top to bottom.

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

这道题给了我们一个二维数组组成的三角形,让我们寻找一条自上而下的路径,使得路径和最短。那么那道题后还是先考虑下暴力破解,我们可以发现如果要遍历所有的路径的话,那可以是阶乘级的时间复杂度啊,OJ必灭之,趁早断了念想比较好。必须要优化时间复杂度啊,题目中给的例子很容易把人带偏,让人误以为贪婪算法可以解题,因为看题例子中的红色数组,在根数字2的下方选小的数字3,在3的下方选小的数字5,在5的下方选小的数字1,每次只要选下一层相邻的两个数字中较小的一个,似乎就能得到答案了。其实是不对的,贪婪算法可以带到了局部最小,但不能保证每次都带到全局最小,很有可能在其他的分支的底层的数字突然变的超级小,但是贪婪算法已经将其他所有分支剪掉了。所以为了保证我们能得到全局最小,动态规划Dynamic Programming还是不二之选啊。其实这道题和 Dungeon Game 非常的类似,都是用DP来求解的问题。那么其实我们可以不新建dp数组,而是直接复用triangle数组,我们希望一层一层的累加下来,从而使得 triangle[i][j] 是从最顶层到 (i, j) 位置的最小路径和,那么我们如何得到状态转移方程呢?其实也不难,因为每个结点能往下走的只有跟它相邻的两个数字,那么每个位置 (i, j) 也就只能从上层跟它相邻的两个位置过来,也就是 (i-1, j-1) 和 (i-1, j) 这两个位置,那么状态转移方程为:

triangle[i][j] = min(triangle[i - 1][j - 1], triangle[i - 1][j])

我们从第二行开始更新,注意两边的数字直接赋值上一行的边界值,那么最终我们只要在最底层找出值最小的数字,就是全局最小的路径和啦,代码如下:

解法一:


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

这种方法可以通过OJ,但是毕竟修改了原始数组triangle,并不是很理想的方法。在网上搜到一种更好的DP方法,这种方法复制了三角形最后一行,作为用来更新的一位数组。然后逐个遍历这个DP数组,对于每个数字,和它之后的元素比较选择较小的再加上面一行相邻位置的元素做为新的元素,然后一层一层的向上扫描,整个过程和冒泡排序的原理差不多,最后最小的元素都冒到前面,第一个元素即为所求。代码如下:

解法二: 


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

下面我们来看一个例子,对于输入数组:

     -1

    2   3

  1  -1  -3

5   3   -1   2

下面我们来看DP数组的变换过程(红色数字为每次dp数组中值改变的位置):

DP:5  3  -1  2

DP:4  3  -1  2

DP:4  -2  -1  2

DP:4  -2  -4  2

DP:0  -2  -4  2

DP:0  -1  -4  2

DP:-2  -1  -4  2

参考资料:

https://leetcode.com/problems/triangle/

Https://leetcode.com/problems/triangle/discuss/38730/DP-Solution-for-Triangle

https://leetcode.com/problems/triangle/discuss/38918/C%2B%2B-top-down-and-bottom-up-solutions.

到此这篇关于c++实现LeetCode(120.三角形)的文章就介绍到这了,更多相关C++实现三角形内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++实现LeetCode(120.三角形)

本文链接: https://lsjlt.com/news/131042.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++实现LeetCode(120.三角形)
    [LeetCode] 120.Triangle 三角形 Given a triangle, find the minimum path sum from top to bottom....
    99+
    2024-04-02
  • C++实现LeetCode(118.杨辉三角)
    [LeetCode] 118.Pascal's Triangle 杨辉三角 Given a non-negative integer numRows, generate t...
    99+
    2024-04-02
  • C++OpenGL实现三角形的绘制
    目录一、绘制三角形1、初始化2、顶点输入3、数据处理4、顶点着色器和片段着色器5、渲染二、完整代码代码输出修改尺寸修改三角形颜色修改背景颜色线框模式一、绘制三角形 1、初始化 (1)...
    99+
    2024-04-02
  • C++实现LeetCode(119.杨辉三角之二)
    [LeetCode] 119. Pascal's Triangle II 杨辉三角之二 Given a non-negative index k whe...
    99+
    2024-04-02
  • C语言实现输出各种三角形
    目录C输出各种三角形C输出各种三角形 for(i=0;i<n;i++) { for(j=0;j<=i;j++) prin...
    99+
    2022-12-08
    C语言输出三角形 C语言三角形 C语言三角形输出
  • java实现三角形分形山脉
    本文实例为大家分享了java实现三角形分形山脉的具体代码,供大家参考,具体内容如下 三角形分形山脉原理 原型图 如图,这是三角形分形山脉的一个原型图。首先我们让x1、x2、x3三个...
    99+
    2024-04-02
  • css如何实现三角形
    css实现三角形的方法::1、创建html文件;2、添加html代码架构;3、在body标签中使用div标签来显示三角形;4、添加script标签并写入css样式代码来实现三角形;5、通过浏览器方式查看设计效果。具体操作方法:首先创建一个h...
    99+
    2024-04-02
  • 如何用css实现三角形
    本篇内容介绍了“如何用css实现三角形”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • 纯css如何实现三角形
    本篇内容介绍了“纯css如何实现三角形”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!css实现三角的原理:首先确定底边是哪个方向,并设置哪个...
    99+
    2023-07-04
  • 怎么用css实现直接画出三角形以及对话形式的三角形
    这篇文章主要为大家展示了“怎么用css实现直接画出三角形以及对话形式的三角形”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用css实现直接画出三角形以及对话...
    99+
    2024-04-02
  • 如何使用CSS实现三角形
    这篇文章将为大家详细讲解有关如何使用CSS实现三角形,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。相信大家在浏览网站的时候,经常看到各种下拉菜单,上面会有一个小小的三角形...
    99+
    2024-04-02
  • CSS实现带阴影的三角形
    怎么用CSS画一个带阴影的三角形呢 有童鞋说, 这还不简单吗网上有很多解决方案, 但其实大多都是实现不太完美的, 存在一些问题假设我们做一个向下的三角形箭头常见的方法大致有两种通过边框控制, border-left和border-right...
    99+
    2023-06-03
  • C++计算圆形、矩形和三角形的面积
    题目描述 运用多态编写程序,声明抽象基类Shape,由它派生出3个派生类: Circle(圆形)、Rectangle(矩形)、Triangle(三角形),用一个函数printArea...
    99+
    2024-04-02
  • 怎么用CSS实现三角形标记
    这篇文章主要介绍怎么用CSS实现三角形标记,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!   代码如下:   CssMark.html   <!DOCTYPEhtml&g...
    99+
    2024-04-02
  • glsl buffer如何实现渐变三角形
    本文小编为大家详细介绍“glsl_buffer如何实现渐变三角形”,内容详细,步骤清晰,细节处理妥当,希望这篇“glsl_buffer如何实现渐变三角形”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。三角形我们通过...
    99+
    2023-07-05
  • C++实现LeetCode(85.最大矩形)
    [LeetCode] 85. Maximal Rectangle 最大矩形 Given a 2D binary matrix filled with 0's and 1's, fin...
    99+
    2024-04-02
  • 纯CSS实现圆角三角形的方法有哪些
    本篇内容主要讲解“纯CSS实现圆角三角形的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“纯CSS实现圆角三角形的方法有哪些”吧!法一. 全兼容的 SV...
    99+
    2024-04-02
  • css3实现三角形的方法有哪些
    这篇文章主要讲解了“css3实现三角形的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css3实现三角形的方法有哪些”吧! ...
    99+
    2024-04-02
  • css3线性渐变怎么实现三角形
    这篇文章主要介绍了css3线性渐变怎么实现三角形的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇css3线性渐变怎么实现三角形文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • CSS中怎么实现小三角形效果
    这篇文章将为大家详细讲解有关CSS中怎么实现小三角形效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。使用CSS实现小三角形效果【附实例】:建议:尽可能的手...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作