[LeetCode 120] - 三角形(Triangle)
2013-06-29 15:48
465 查看
问题
给出一个三角形,找出从顶部至底部的最小路径和。每一步你只能移动到下一行的邻接数字。例如,给出如下三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
从顶部至底部的最小路径和为11(即2+3+5+1=11)。
注意:
加分项-如果你能只使用O(n)的额外空间,n为三角形中的总行数。
初始思路
最直接的思路就是把路径都走一遍。即从顶点出发,分别往左中右移动(如果可能的话);然后对走到的位置继续进行同样移动,直到走到最后一行。这样就可以得到一个递归的方案,而递归的结束条件就是前面所说的走到最后一行。伪代码如下:[最短路径长度] 查找路径(当前节点坐标,当前路径值)
如果是最后一行,返回当前路径值+当前节点值
否则
如果可以往左下走,左路径 = 当前路径值 + 查找路径(左下节点坐标,当前路径值)
如果可以往下走,下路径 = 当前路径值 + 查找路径(下节点坐标,当前路径值)
如果可以往右下走,右路径 = 当前路径值 + 查找路径(右下节点坐标,当前路径值)
找出左路径,下路径和右路径中的最小值,返回该最小值
结合范例数据仔细分析一下上面的伪代码, 可以发现其中有不少重复的步骤。如2->3->5和2->4->5后面的处理是完全相同的。回想一下我们在 [LeetCode 132] - 回文分割II(Palindrome Partitioning II) 中的做法,可以使用一个map保存已计算过的路径来应对这种重复。这里我们使用std::map<std::pair<int, int>, int>,将某点的坐标作为map的key,从key出发的最小路径作为值。
按以上思路完成代码提交后发现有些测试用例不能通过,如:
[
[-1]
[3,2]
[-3,1,-1]
]
按以上算法得出的值为-2,而期望的值为-1。-2为-1 -> 2-> -3这条路径得出的值,而-1为路径-1 -> 3 -> -3。看来题目中的邻接(英文原文adjacent)规定只能往下或者右走。修改也很简单,将代码中处理向左下走的那部分逻辑去掉即可。最终通过了Judge Small和Judge Large的代码如下:
class Solution { public: int minimumTotal(std::vector<std::vector<int> > &triangle) { std::vector<int> pathInfo(triangle.size()); pathInfo[0] = triangle[0][0]; for(int i = 1; i < triangle.size(); ++i) { for(int j = i; j >= 0; --j) { if(j == 0) { pathInfo[j] = pathInfo[j] + triangle[i][j]; } else if(j == triangle[i].size() - 1) { pathInfo[j] = pathInfo[j - 1] + triangle[i][j]; } else { pathInfo[j] = pathInfo[j] < pathInfo[j - 1] ? pathInfo[j] : pathInfo[j - 1]; pathInfo[j] += triangle[i][j]; } } } int min = *pathInfo.begin(); for(auto iter = pathInfo.begin() + 1; iter != pathInfo.end(); ++iter) { if(min > *iter) { min = *iter; } } return min; } };
minimumTotal_Bonus
使用了新的算法后,不但减少了空间复杂度,递归也不再需要了,过Judge Large的时间由130ms左右降到了40ms左右。
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【120-Triangle(三角形)】
- Leetcode 120 Triangle 三角形最小路径和
- 【LeetCode-面试算法经典-Java实现】【120-Triangle(三角形)】
- Leetcode-120_Triangle(三角形)—动态规划解法+记忆化搜索解法-【C++】
- 【LeetCode】(120)Triangle (Medium)
- LeetCode: Triangle [120]
- leetcode 120: Triangle
- leetcode[120]Triangle
- LeetCode 62/63/120/64 Unique PathsI/II Triangle/Min sum Path/Rectangle Area--DP
- LeetCode120 Triangle
- LeetCode 120 Triangle
- leetcode——120——Triangle
- LeetCode 120 Triangle
- LeetCode 120 : Triangle
- leetcode[120] Triangle
- [leetcode 120]triangle 空间O(n)算法
- LeetCode(120) Triangle
- [Leetcode] triangle 三角形
- leetcode-120-Triangle 动态规划
- LeetCode(120)Triangle