leetcode:Triangle
2015-11-10 15:07
330 查看
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.
Subscribe to see which com
用递归超时,通不过。
迭代-动态规划:
1.从上往下遍历 :求每一层,到每个位置的路径最小值,下一层的每个位置的路径最小值只与前一层的某一条(第一个位置和最后一个位置)或者两条路径相关。即通过求前一阶段(每个位置)的最优解推出下一阶段(每个位置)的最优解。
2.从下往上遍历,思路差不多,但是不需要考虑第一个和最后一个位置只有一条路径的情况
参考:http://www.tuicool.com/articles/i22yam
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.
Subscribe to see which com
用递归超时,通不过。
迭代-动态规划:
1.从上往下遍历 :求每一层,到每个位置的路径最小值,下一层的每个位置的路径最小值只与前一层的某一条(第一个位置和最后一个位置)或者两条路径相关。即通过求前一阶段(每个位置)的最优解推出下一阶段(每个位置)的最优解。
class Solution { public: /*int dfs(vector<vector<int>>& triangle,int index,int level){ if(level>=triangle.size()) return 0; if(index+1>=triangle[level].size()) return triangle[level][index]+dfs(triangle,index,level+1); return min(triangle[level][index]+dfs(triangle,index,level+1),triangle[level][index+1]+dfs(triangle,index+1,level+1)); } */ int minimumTotal(vector<vector<int>>& triangle) { //return dfs(triangle,0,0);//超时 if(triangle.size()<=0) return 0; int ret=INT_MAX; vector<vector<int>> flg=triangle; int level=1; for(;level<triangle.size();level++){ for(int index=0;index<triangle[level].size();index++){ if(index==0) flg[level][index]=triangle[level][index]+flg[level-1][index]; else if(index==triangle[level].size()-1) flg[level][index]=triangle[level][index]+flg[level-1][index-1]; else flg[level][index]=triangle[level][index]+min(flg[level-1][index-1],flg[level-1][index]); } } level--; for(int index=0;index<flg[level].size();index++){ ret=ret>flg[level][index]?flg[level][index]:ret; } return ret; } };
2.从下往上遍历,思路差不多,但是不需要考虑第一个和最后一个位置只有一条路径的情况
参考:http://www.tuicool.com/articles/i22yam
int minimumTotal(vector<vector<int>>& triangle) { //return dfs(triangle,0,0);//超时 if(triangle.size()<=0) return 0; vector<vector<int>> flg=triangle; int level=triangle.size()-2; for(;level>=0;level--){ for(int index=0;index<triangle[level].size();index++){ flg[level][index]=triangle[level][index]+min(flg[level+1][index+1],flg[level+1][index]); } } return flg[0][0]; }
相关文章推荐
- Mysql学习篇之---四种Blob类型
- SSAS IIS 发布
- 多个AsyncTask任务串并行简单分析
- 星星的眼睛眨呀眨
- maltab line函数用法
- git commit 解决non fast forward
- 着色器的细节层次技术 Shader Level of Detail
- 【数据结构】队列的基本操作
- Android自定义Toast样式
- android4.4.2 Camera源码导入Eclipse
- ViewPager循环滑动图片集合,以及删除图片功能
- HTML5中类jQuery选择器querySelector的使用
- linux系统中查看系统、资源、日志等常用命令--转载
- Testing Using Windows Live Writer
- JSON.stringify转换Date不正确的解決方法
- Vb.net 控件背景色透明设置BackColor 和Parent
- java 验证码实现
- C#时间格式转换成ISO8601标准
- iOS---There was an internal API error 错误
- java File上传图片获取图片宽度高度