您的位置:首页 > 其它

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];
}
};
运行时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息