[Leetcode] 120. Triangle 解题报告
2017-04-28 10:43
274 查看
题目:
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
The minimum path sum from top to bottom is
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.
思路:
本题也是典型的动态规划题目,有点类似于Pascal Triangle。比较直观的思路是从上往下扫描,但是更巧妙的思路是从下往上扫描。不过无论如何,算法的时间复杂度都是O(n),空间复杂度也为O(n)。
代码:
1、从上往下扫描:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle)
{
if(triangle.size() == 0) {
return 0;
}
vector<int> dp;
dp.push_back(triangle[0][0]);
for (int i = 1; i < triangle.size(); ++i) {
vector<int> temp(dp);
dp[0] = temp[0] + triangle[i][0];
for(int j = 1; j <= i - 1; ++j) {
dp[j] = std::min(temp[j - 1], temp[j]) + triangle[i][j];
4000
}
dp.push_back(temp[i - 1] + triangle[i][i]);
}
int minValue = std::numeric_limits<int>::max();
for(int i = 0; i < dp.size(); ++i) {
if(dp[i] < minValue) {
minValue = dp[i];
}
}
return minValue;
}
};
2、从下往上扫描:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
if(triangle.size() == 0) {
return 0;
}
int len = triangle.size();
vector<int> dp(triangle[len - 1].size());
for(int i = 0; i < dp.size(); i++) {
dp[i] = triangle[len-1][i];
}
for(int i = len - 2; i >= 0; i--) {
for(int j = 0 ; j < triangle[i].size(); j++) {
dp[j] = min(dp[j], dp[j + 1]) + triangle[i][j];
}
}
return dp[0];
}
};
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.
思路:
本题也是典型的动态规划题目,有点类似于Pascal Triangle。比较直观的思路是从上往下扫描,但是更巧妙的思路是从下往上扫描。不过无论如何,算法的时间复杂度都是O(n),空间复杂度也为O(n)。
代码:
1、从上往下扫描:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle)
{
if(triangle.size() == 0) {
return 0;
}
vector<int> dp;
dp.push_back(triangle[0][0]);
for (int i = 1; i < triangle.size(); ++i) {
vector<int> temp(dp);
dp[0] = temp[0] + triangle[i][0];
for(int j = 1; j <= i - 1; ++j) {
dp[j] = std::min(temp[j - 1], temp[j]) + triangle[i][j];
4000
}
dp.push_back(temp[i - 1] + triangle[i][i]);
}
int minValue = std::numeric_limits<int>::max();
for(int i = 0; i < dp.size(); ++i) {
if(dp[i] < minValue) {
minValue = dp[i];
}
}
return minValue;
}
};
2、从下往上扫描:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
if(triangle.size() == 0) {
return 0;
}
int len = triangle.size();
vector<int> dp(triangle[len - 1].size());
for(int i = 0; i < dp.size(); i++) {
dp[i] = triangle[len-1][i];
}
for(int i = len - 2; i >= 0; i--) {
for(int j = 0 ; j < triangle[i].size(); j++) {
dp[j] = min(dp[j], dp[j + 1]) + triangle[i][j];
}
}
return dp[0];
}
};
相关文章推荐
- [leetcode] 120. Triangle 解题报告
- Leetcode 120. Triangle 三角形问题(动态规划经典) 解题报告
- LeetCode 120. Triangle 解题报告
- LeetCode 120. Triangle 解题报告
- LeetCode解题报告 120. Triangle [medium]
- Leetcode 解题报告整理索引(更新至154题)
- [Leetcode] 756. Pyramid Transition Matrix 解题报告
- [Leetcode] 171. Excel Sheet Column Number 解题报告
- LeetCode 5. Longest Palindromic Substring 解题报告
- leetcode [Nim game解题报告]
- 【LeetCode】94.Binary Tree Inorder Traversal(Medium)解题报告
- LeetCode 22. Generate Parentheses 解题报告
- [Leetcode] 761. Special Binary String 解题报告
- LeetCode 3. Longest Substring Without Repeating Characters 解题报告
- [Leetcode] 200. Number of Islands 解题报告
- [Leetcode] 762. Prime Number of Set Bits in Binary Representation 解题报告
- [Leetcode] 110. Balanced Binary Tree 解题报告
- 【LeetCode】110. Balanced Binary Tree(Easy)解题报告
- [leetcode] 391. Perfect Rectangle 解题报告
- [leetcode] 394. Decode String 解题报告