(算法分析Week8)Triangle[Medium]
来源:互联网 发布:渡口网络还在吗 编辑:程序博客网 时间:2024/06/07 16:32
120.Triangle[Medium]
题目来源
Description
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.
Solution
贪心算法不可取,因为题目限制了只能在相邻点上寻路。
比如
[ [-1], [2,3], [1,-1,-3]]
如果用贪心算法,-1+2+(-1) = 0;
而真正的答案应该是 -1+3+(-3) = -1
还是动态规划。
一种比较直观的思路就是,求出每一条路径的代价值,然后比较找到最少的。可以通过两重循环,从第2层(相当于下标为1)开始,每次用新的代价值替换旧值,不断迭代,最后一层时即可求出每一条路径的代价。这样时间复杂度比较高,但是不需要额外的空间。
或者可以从底往上,对于每个数字,和它之后的元素比较选择较小的,再加上上面一行相邻位置的元素做为新的元素,然后一层一层的向上扫描。如果不想改动原triangle,就新开辟一个一维数组作为临时存储(初始值赋三角形最后一行的数据)
公式:
dp[j] = min(dp[j], dp[j + 1]) + triangle[i][j];
Complexity analysis
O(n²)
Code
(1)自上而下class Solution {public: int minimumTotal(vector<vector<int>>& triangle) { if (triangle.size() == 1) { return triangle[0][0]; } int ans = INT_MAX; for (int i = 1; i <= triangle.size()-1; i++) { triangle[i][0] += triangle[i-1][0]; triangle[i][triangle[i].size()-1] += triangle[i-1][triangle[i-1].size()-1]; for (int j = 1; j <= triangle[i].size()-2; j++) { int a = triangle[i-1][j]; int b = triangle[i-1][j-1]; triangle[i][j] += min(a, b); } } for (int i = 0; i < triangle[triangle.size()-1].size(); i++) { if (ans > triangle[triangle.size()-1][i]) { ans = triangle[triangle.size()-1][i]; } } return ans; }};(2)自下而上class Solution {public: int minimumTotal(vector<vector<int> > &triangle) { vector<int> dp(triangle.back()); for (int i = 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]; }};
Result
- (算法分析Week8)Triangle[Medium]
- Task Scheduler(算法分析week8)
- Queue Reconstruction by Height(算法分析week8)
- (算法分析Week8)Climbing Stairs[Easy]
- [Medium]Triangle
- Leetcode: 322. Coin Change(Week8, Medium)
- [Leetcode 120, Medium] Triangle
- 【LeetCode】(120)Triangle (Medium)
- 120. Triangle -Medium
- 120. Triangle Medium
- (算法分析Week2)3Sum[Medium]
- (算法分析Week3)Pow(x,n)[Medium]
- (算法分析Week5)Add Two Numbers[Medium]
- (算法分析Week6)Longest Palindromic Substring[Medium]
- (算法分析Week7)Divide Two Integers[Medium]
- (算法分析Week10)ZigZag Conversion[Medium]
- (算法分析Week11)Generate Parentheses[Medium]
- (算法分析Week12)Unique Paths[Medium]
- SLAM+AR 技术与应用的一些思考
- Mysql 中view创建
- spring整合redis缓存
- Trunk(主线), Branch(分支), Tag(标记)
- Django官方教程(十)【进阶内容:编写可重用的应用】
- (算法分析Week8)Triangle[Medium]
- Java
- node安装模块时报错no such file or directory, open '/Users/chenchang/package.json'
- ICPC-西安赛区:翻船
- 第九篇 elasticsearch的document数据路由原理
- MongoDB+MongoVUE安装及入门
- 组合模式
- 使用eclipse进行JavaEE开发,查看经过Tomcat编译后的字节码文件路径
- SpringMVC 处理静态文件