文章目录

  • 1 题目理解
  • 2 解题
    • 2.1 动态规划
    • 2.2 优化空间
    • 2.3进一步优化空间

1 题目理解

Given a triangle array, return the minimum path sum from top to bottom.
For each step, you may move to an adjacent number on the row below.

输入:一个三角形数组List<List> triangle
输出:从顶层走到底层最小路径和
规则:每次只能从上一层走到下一层的相邻单元。相邻单元是指与上一层下标相同,或者上一层下标+1。

Example 1:
Input: triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
Output: 11
Explanation: The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

2 解题

2.1 动态规划

2
3 4
6 5 7
4 1 8 3

用dp[i][j]表示达到第i层第j列位置的最小路劲和。
根据题意,要想达到(i,j)只能通过(i-1,j)或者(i-1,j-1)两种方式达到。
那动态转移方程是:dp[i][j]=min(dp[i−1][j−1],dp[i−1][j])+triangle[i][j]dp[i][j] =min(dp[i-1][j-1],dp[i-1][j])+triangle[i][j]dp[i][j]=min(dp[i−1][j−1],dp[i−1][j])+triangle[i][j]
初始化条件:dp[0][0]=triangle[0][0]
最后结果是在最后一层数组中查找最大值

class Solution {public int minimumTotal(List<List<Integer>> triangle) {int m = triangle.size();int n = triangle.get(m-1).size();int[][] dp = new int[m][n];dp[0][0] = triangle.get(0).get(0);for(int i=1;i<m;i++){int len = triangle.get(i).size();for(int j=0;j<len;j++){dp[i][j] = Integer.MAX_VALUE;if(j==0) {dp[i][j] = dp[i-1][j]+triangle.get(i).get(j);}else if(j==len-1){dp[i][j] = dp[i-1][j-1]+triangle.get(i).get(j);}else{dp[i][j] = Math.min(dp[i-1][j],dp[i-1][j-1])+triangle.get(i).get(j);}}}int min = dp[m-1][0];for(int j=1;j<n;j++){min = Math.min(min,dp[m-1][j]);}return min;}
}

时间复杂度:O(n2)O(n^2)O(n2),n是triangle的长度。

2.2 优化空间

仔细观察我们发现动态转移方程只与i-1有关系,所以我们可以使用滚动数组来实现。

class Solution {public int minimumTotal(List<List<Integer>> triangle) {int m = triangle.size();int n = triangle.get(m-1).size();int[] dp = new int[1];dp[0] = triangle.get(0).get(0);for(int i=1;i<m;i++){int len = triangle.get(i).size();int[] newDp = new int[len];for(int j=0;j<len;j++){newDp[j] = Integer.MAX_VALUE;if(j==0) {newDp[j] = dp[j]+triangle.get(i).get(j);}else if(j==len-1){newDp[j] = dp[j-1]+triangle.get(i).get(j);}else{newDp[j] = Math.min(dp[j],dp[j-1])+triangle.get(i).get(j);}}dp = newDp;}int min = dp[0];for(int j=1;j<dp.length;j++){min = Math.min(min,dp[j]);}return min;}
}

2.3进一步优化空间

方程中计算j的时候只与j和j-1相关。如果我们的只有一个数组int[] dp,那我们可以从右到左计算。
我们计算dp[j]的时候使用了dp[j]和dp[j-1],
在计算dp[j-1]的时候使用dp[j-1]和dp[j-2],与dpp[j]无关,所以可以这样做。

class Solution {public int minimumTotal(List<List<Integer>> triangle) {int m = triangle.size();int n = triangle.get(m-1).size();int[] dp = new int[n];dp[0] = triangle.get(0).get(0);for(int i=1;i<m;i++){int len = triangle.get(i).size();dp[i] = dp[i-1] + triangle.get(i).get(i);for(int j=i-1;j>0;j--){dp[j] = Math.min(dp[j],dp[j-1])+triangle.get(i).get(j);}dp[0] += triangle.get(i).get(0);}int min = dp[0];for(int j=1;j<dp.length;j++){min = Math.min(min,dp[j]);}return min;}
}

120. Triangle相关推荐

  1. 【DP】LeetCode 120. Triangle

    LeetCode 120. Triangle Solution1:我的答案 真费劲啊!!! 啊!!!!!! class Solution { public:int minimumTotal(vecto ...

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

    Title 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点. 例 ...

  3. leetcode @python 120. Triangle

    题目链接 https://leetcode.com/problems/triangle/ 题目原文 Given a triangle, find the minimum path sum from t ...

  4. 继续过中等难度.0309

      .   8  String to Integer (atoi)    13.9% Medium   . 151 Reverse Words in a String      15.7% Mediu ...

  5. python基础刷题_数据结构与算法LeetCode刷题(Python)

    参考资料: 一.链表 1.  链表的必备知识要点(包括基础知识.刷题中使用的STL等知识) 2.  链表逆序(LeetCode 92 ,206. Reverse Linked List 1,2) 3. ...

  6. 01背包, 完全背包,多重背包

    优秀博文01背包https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 背包问题泛指以下这一种问题: 给定一组有固定价值和固定重量的 ...

  7. 用turtle画各种各样的数学图形

    ps,用turtle导入小海龟来画图.画图代码都要导入海龟库哦,见下面第一行. import turtle as t 直线 # 画直线 def draw_line():pen = t.Pen()pen ...

  8. LEETCODE-刷题个人笔记 Python(1-400)-TAG标签版本

    1. Array (1) 27. Remove Element(Easy) 给定数组nums和值val,在适当位置删除该值的所有实例并返回新长度. 思路: 不需要使用排序,如果等于该值,则将n-1的值 ...

  9. leetcode刷题规划

    LeetCode精华题目列表[刷题规划系列] – TuringPlanet 目录 算法题到底在考察什么? 题目列表 Array String Linked List Queue Stack Advan ...

最新文章

  1. java集合框架图(一)
  2. 华为有了鸿蒙就可以翻身吗,鸿蒙2.0要来了,华为手机能靠此翻身吗?
  3. Cambridge partner
  4. 图像处理之中值滤波介绍及C实现
  5. iphone11什么时候上市_hd3手表高仿哪里买 什么时候上市?
  6. 【代码笔记】iOS-UILable电子表显示
  7. mysql 数据库乱码_Mysql数据库乱码问题的对应方式
  8. 智慧医疗解决方案可以大大减少医疗资源浪费!
  9. 关于ADO.Net连接池(Connection Pool)的一些个人见解
  10. 先学python再学c_初学者Python和C先学哪个好?
  11. Lenovo DS存储Linux下ISCSI 多路径映射配置
  12. [数据结构 算法] 2015年蓝桥杯A组C/C++第三题奇妙的数字
  13. python整形_Python中的最大整型数值
  14. excel 去掉公式保留数值的方法
  15. Visual studio 2015(VS2015)的下载和安装,以及安装VS2015中的C++
  16. C#免装oracle客户端查询AMERICAN_AMERICA.US7ASCII字符集 中文乱码解决办法
  17. 汉王科技在人民大会堂响起自主品牌的高亢之声
  18. 计算机网络与无线通信系统学习1:计算机通信网概述
  19. 记录kettle spoon.bat 无法启动 (系统找不到指定的路径。) 只有无限接近死亡 才能领悟真滴
  20. 去天瑞地安面试了 这是我整个的面试流程

热门文章

  1. Ruby学习-第二章
  2. MapReduce 作业调试
  3. 文件上传简介1---上传到指定的目录
  4. springboot 整合 kafka demo 顺便看一下源码
  5. 多服务器 elk 搭建 [elasticsearch 7.0 ]
  6. 第11章-img特征,vertical-align,cursor,opacity
  7. python3 装饰器参数_Learn Python 3:装饰器
  8. Java “\”与\\的替换
  9. 计算机快捷键知识点,电脑常用快捷键基础的知识点(12页)-原创力文档
  10. c语言用for编程图形,C语言编程题求解