题意:给一个用序列堆成的三角形,第n层的元素个数为n,从顶往下,每个元素可以选择与自己最近的两个下层元素往下走,类似一棵二叉树,求最短路。

 

[2],
[3,4],
[6,5,7],
[4,1,8,3]


 

  注意:这里可以2->3>5>1,也可以2->4>5->1,隔层相邻就可以走。

 

思路:可以从下往上走,也可以从上往下走。都是O(n)的空间,平方阶的复杂度。

  从下往上可能更简洁,因为比较到最后只有一个元素,就是为答案了,速度自然也就快,每遍历一层就有1个被淘汰。

  然而我一开始想到的是从上往下,以为会很简单,结果就这样了。记得从右往左扫,不然会覆盖掉之前记录的那些值。

 


LeetCode Triangle 三角形(最短路)_i++LeetCode Triangle 三角形(最短路)_c代码_02


1 class Solution {
2 public:
3 int minimumTotal(vector<vector<int>>& triangle) {
4 if(triangle.empty() || triangle[0].empty() ) return 0;
5
6 vector<int> path( triangle.size() ,0 );
7 path[0]=triangle[0][0];
8
9 for(int i=1; i<triangle.size(); i++)
10 {
11 path[ i ]=path[i-1]+triangle[i][i];
12 for( int j=triangle[i].size()-2 ; j>0; j--) //注意从后扫,不然会覆盖到前面
13 path[j]=triangle[i][j] + min( path[j-1] , path[j] );
14 path[0]+=triangle[i][0];//因此这个要摆在最后
15 }
16
17 return *min_element(path.begin(),path.end());
18 }
19 };

AC代码

 


作者:​​xcw0754​