Triangle
2015-09-07 17:18
330 查看
刚那道题立刻想到动态规划,从顶开始向下走,使用二维数组存储每个位置当前最小值。没有什么思想可说,直接上代码。
class Solution {
public:
int minimumTotal(vector<vector<int> >& triangle) {
int size = triangle.size();
// int len = triangle[0].size();
if(size==0)
return 0;
for(int i=1;i<size;i++)
for(int j=0;j<triangle[i].size();j++){
if(j==0) //第一行
triangle[i][j] = triangle[i][j] + triangle[i-1][j];
else if(j==triangle[i].size()-1) //最后一行处理
triangle[i][j] = triangle[i][j] + triangle[i-1][j-1];
else{ //中间处理
if(triangle[i][j]+triangle[i-1][j-1] < triangle[i][j]+triangle[i-1][j])
triangle[i][j] = triangle[i-1][j-1]+triangle[i][j];
else
triangle[i][j] = triangle[i][j]+triangle[i-1][j];
}
}
int min_path = triangle[size-1][0];
for(int j=1;j<triangle[size-1].size();j++){ //找到最小值
int t = triangle[size-1][j];
if(min_path > triangle[size-1][j])
min_path = triangle[size-1][j];
}
return min_path;
}
};
运行时间
虽然AC了,但是运行时间有点慢,而且代码比较繁复。仔细思考了一下,网上看看别人的思路,发现我们可以使用一个一维数组搞定。这种方法的最主要的思想是从后往前便利,因为从前往后便利会使得前面的状态在被后面状态使用前发生改变,因此我们使用倒序遍历,即从最后一行开始向第一行便利。代码
class Solution { public: int minimumTotal(vector<vector<int> > &triangle) { int s = triangle.size(); if(s != (triangle[s-1].size())) return -1; if(s==1) return triangle[0][0]; int *d = new int[s]; int i,j; for(i=0;i<s;i++) d[i]=triangle[s-1][i]; for(i=s-2;i>=0;i--) { for(j=0;j<=i;j++) { d[j]=triangle[i][j]+min(d[j],d[j+1]); } } return d[0]; } };运行时间
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- refereed to as “triangle
- css简单实现三角形箭头
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解