题目详情

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

例如,给定三角形:

  1. [
  2. [2],
  3. [3,4],
  4. [6,5,7],
  5. [4,1,8,3]
  6. ]

自顶向下的最小路径和为 11(即,3 + 1 = 11)。

说明:

如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。


解决代码(1)—— 空间复杂度为O(N^2)

解决思路

这个题目非常明显的动态规划问题, 当前节点的最小值由前面一层的一个(当为第一个或最后一个点)或两个节点决定, 所以维护一个二维数组,保存到达每个节点的最小路径值,通过递推式求出所有的点的最小路径值,然后返回最后一层的最小值就是目标值了

  1. //递推式可以很容易看出
  2. //中间点
  3. minPath[i][j] = min(minPath[i-1][j-1] + triangle[i][j], minPath[i-1][j] + triangle[i][j]);

代码及注释

  1. class Solution {
  2. public:
  3. int minimumTotal(vector<vector<int>>& triangle) {
  4. //minPath 表示走到当前点的最小路径
  5. vector<vector<int>> minPath = triangle;
  6. int n = triangle.size();
  7. for (int i = 1; i < n; i++) {
  8. for (int j = 0; j <= i; j++) {
  9. //当计算节点是头结点或者尾节点时,走到此节点的路径只有一个
  10. if (j == 0) {
  11. minPath[i][j] = minPath[i - 1][j] + triangle[i][j];
  12. } else if (j == i) {
  13. minPath[i][j] = minPath[i - 1][j - 1] + triangle[i][j];
  14. } else {
  15. //当非头尾节点的时候, 走到节点的方式有两种
  16. minPath[i][j] = min(minPath[i-1][j-1] + triangle[i][j], minPath[i-1][j] + triangle[i][j]);
  17. }
  18. }
  19. }
  20. //返回最后一层节点的最小路径的最小值 即目标值
  21. return *min_element(minPath[n-1].begin(), minPath[n-1].end());
  22. }
  23. };

解决代码(二) 空间复杂度为O(N)

解决思路

题目给了提示, 可以优化到空间为O(N)

其实不需要存所有的点, 或者说有些点用完后就不会在用了, 比如我算第三层, 那么第一层的值就用不到了, 所以我们只需维护两个个大小为N数组 保存当前层和上一层就可以优化到O(N)了!

基本想法和解法1 相同, 就不给出代码了

解决代码(三)自底向上

解法二准确来说还是用了2个数组O(2N), 是否能用一个数组来解决问题呢?

解决思路

因为上一层的每个点到下一层都有两种方式,通过反推,由最后一层一直推到第一层。

有递推式

minPath[i] = 当前点值 + min(上一层的左边点值, 上一层的右边点值)

代码如下

  1. class Solution {
  2. public:
  3. int minimumTotal(vector<vector<int> > &triangle)
  4. {
  5. vector<int> minPath= triangle[triangle.size()-1];
  6. for ( int i = triangle.size() - 2; i>= 0 ; --i )
  7. for ( int j = 0; j < triangle[i].size() ; ++ j )
  8. minPath[j] = triangle[i][j] + min(minPath[j],minPath[j+1]);
  9. return minPath[0];
  10. }
  11. };
  12. ```x

LeetCode 120. Triangle (三角形最小路径和)详解的更多相关文章

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

    题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...

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

    给出一个三角形(数据数组),找出从上往下的最小路径和.每一步只能移动到下一行中的相邻结点上.比如,给你如下三角形:[     [2],    [3,4],   [6,5,7],  [4,1,8,3]] ...

  3. [算法]LeetCode 120:三角形最小路径和

    题目描述: 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和 ...

  4. LeetCode刷题: 【120】三角形最小路径和

    1. 题目: 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小 ...

  5. Leetcode120.Triangle三角形最小路径和

    给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11 ...

  6. Java实现 LeetCode 120 三角形最小路径和

    120. 三角形最小路径和 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] ...

  7. 领扣-120 三角形最小路径和 Triangle MD

    三角形最小路径和 Triangle 数组 动态规划 问题 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [2], [3,4], [6,5,7], ...

  8. leetcode 120. 三角形最小路径和 及 53. 最大子序和

    三角形最小路径和 问题描述 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] ...

  9. 1. 线性DP 120. 三角形最小路径和

    经典问题: 120. 三角形最小路径和  https://leetcode-cn.com/problems/triangle/ func minimumTotal(triangle [][]int) ...

随机推荐

  1. Dresdon二次开发

    在上一篇文章中,我们已经对Dresdon所提供的功能进行了简单的介绍.在这篇文章中,我们将介绍如何基于Dresdon进行二次开发. Dresdon的扩展点 就像上一篇文章所介绍的那样,Dresdon主 ...

  2. P3913 车的攻击

    大致题意: 求出被车攻击到的格子 基本思路: 如果直接暴力出奇迹的话是存不下的, 所以就以另外的思路来想. 容斥原理! 我们可以先把那些在同一行或同一列的车去重,然后把去重后的行数列数记作cntx,c ...

  3. 面试锦囊 | HTTP 面试门路

    前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 Github 博客 学习清单: 零.前置知识 幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同 一.PUT ...

  4. xenomai内核解析--双核系统调用(三)--如何为xenomai添加一个系统调用

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正. @ 目录 一.添加系统调用 二.Cobalt库添加接口 三.应用使用 一.添加系统调用 下面给xenomai添加一个系统调用g ...

  5. Shell基本语法---case语句

    case语句 格式 case 变量 in 值1 ) 执行动作1 ;; 值2 ) 执行动作2 ;; 值3 ) 执行动作3 ;; .... * ) 如果变量的值都不是以上的值,则执行此程序 ;; esac ...

  6. 从零开始学Electron笔记(七)

    在之前的文章我们介绍了一下Electron中的对话框 Dialog和消息通知 Notification,接下来我们继续说一下Electron中的系统快捷键及应用打包. 全局快捷键模块就是 global ...

  7. 在Ubuntu 18.04中安装Wine QQ、微信、TIM

    近日重新安装了Ubuntu 18.04,因此要重新安装一下Wine QQ.微信之类的,完整安装Wine系列软件一直是一个老大难的问题,网上搜集到的博客也比较零散,因此这里特此写篇博客记录一下 0. 这 ...

  8. Java+MySQL企业级实训全套课程

    总纲 JAVA基础部分 教学视频:第一讲:Java入门与环境搭建    提取码:h9vm第二讲:变量与运算符    提取码:928t第三讲:顺序结构及条件结构    提取码:3v1l第四讲:while ...

  9. 手写IOC容器

    IOC(控制翻转)是程序设计的一种思想,其本质就是上端对象不能直接依赖于下端对象,要是依赖的话就要通过抽象来依赖.这是什么意思呢?意思就是上端对象如BLL层中,需要调用下端对象的DAL层时不能直接调用 ...

  10. JAVA OOP 编程-常用设计模式

    smart-design-pattern 吼吼!10分钟内快速回顾所有设计模式及应用场景 其实,工作三年以上,精通coding,深知并发编程,熟悉OOP思想,但却因为种种原因! 没有在学习生涯初期就看 ...