120. Triangle
文章目录
- 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相关推荐
- 【DP】LeetCode 120. Triangle
LeetCode 120. Triangle Solution1:我的答案 真费劲啊!!! 啊!!!!!! class Solution { public:int minimumTotal(vecto ...
- 120. Triangle 三角形最小路径和
Title 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点. 例 ...
- leetcode @python 120. Triangle
题目链接 https://leetcode.com/problems/triangle/ 题目原文 Given a triangle, find the minimum path sum from t ...
- 继续过中等难度.0309
. 8 String to Integer (atoi) 13.9% Medium . 151 Reverse Words in a String 15.7% Mediu ...
- python基础刷题_数据结构与算法LeetCode刷题(Python)
参考资料: 一.链表 1. 链表的必备知识要点(包括基础知识.刷题中使用的STL等知识) 2. 链表逆序(LeetCode 92 ,206. Reverse Linked List 1,2) 3. ...
- 01背包, 完全背包,多重背包
优秀博文01背包https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 背包问题泛指以下这一种问题: 给定一组有固定价值和固定重量的 ...
- 用turtle画各种各样的数学图形
ps,用turtle导入小海龟来画图.画图代码都要导入海龟库哦,见下面第一行. import turtle as t 直线 # 画直线 def draw_line():pen = t.Pen()pen ...
- LEETCODE-刷题个人笔记 Python(1-400)-TAG标签版本
1. Array (1) 27. Remove Element(Easy) 给定数组nums和值val,在适当位置删除该值的所有实例并返回新长度. 思路: 不需要使用排序,如果等于该值,则将n-1的值 ...
- leetcode刷题规划
LeetCode精华题目列表[刷题规划系列] – TuringPlanet 目录 算法题到底在考察什么? 题目列表 Array String Linked List Queue Stack Advan ...
最新文章
- java集合框架图(一)
- 华为有了鸿蒙就可以翻身吗,鸿蒙2.0要来了,华为手机能靠此翻身吗?
- Cambridge partner
- 图像处理之中值滤波介绍及C实现
- iphone11什么时候上市_hd3手表高仿哪里买 什么时候上市?
- 【代码笔记】iOS-UILable电子表显示
- mysql 数据库乱码_Mysql数据库乱码问题的对应方式
- 智慧医疗解决方案可以大大减少医疗资源浪费!
- 关于ADO.Net连接池(Connection Pool)的一些个人见解
- 先学python再学c_初学者Python和C先学哪个好?
- Lenovo DS存储Linux下ISCSI 多路径映射配置
- [数据结构 算法] 2015年蓝桥杯A组C/C++第三题奇妙的数字
- python整形_Python中的最大整型数值
- excel 去掉公式保留数值的方法
- Visual studio 2015(VS2015)的下载和安装,以及安装VS2015中的C++
- C#免装oracle客户端查询AMERICAN_AMERICA.US7ASCII字符集 中文乱码解决办法
- 汉王科技在人民大会堂响起自主品牌的高亢之声
- 计算机网络与无线通信系统学习1:计算机通信网概述
- 记录kettle spoon.bat 无法启动 (系统找不到指定的路径。) 只有无限接近死亡 才能领悟真滴
- 去天瑞地安面试了 这是我整个的面试流程
热门文章
- Ruby学习-第二章
- MapReduce 作业调试
- 文件上传简介1---上传到指定的目录
- springboot 整合 kafka demo 顺便看一下源码
- 多服务器 elk 搭建 [elasticsearch 7.0 ]
- 第11章-img特征,vertical-align,cursor,opacity
- python3 装饰器参数_Learn Python 3:装饰器
- Java “\”与\\的替换
- 计算机快捷键知识点,电脑常用快捷键基础的知识点(12页)-原创力文档
- c语言用for编程图形,C语言编程题求解