leetcode—triangle
1.题目描述
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).
2.解法分析
此题最简单的想法就是一个深度搜索,将所有可能的路径全部找出来,比较它们的和,于是有了如下的代码:
class Solution {public:int minimumTotal(vector<vector<int> > &triangle) {// Start typing your C/C++ solution below// DO NOT write int main() function//by areslipan@163.comint minTotal= 0;for(int i = 0;i<triangle.size();++i){minTotal+=triangle[i][0];}triangleHeight = triangle.size();int depth = 1;int curSum = 0;minnum(triangle,minTotal,1,0,curSum);return minTotal;}void minnum(vector<vector<int>> &triangle,int & minTotal,int depth,int loc,int &curSum){curSum+=triangle[depth-1][loc];if(depth == triangleHeight){minTotal = minTotal<curSum?minTotal:curSum;return;}minnum(triangle,minTotal,depth+1,loc,curSum);curSum -= triangle[depth][loc];minnum(triangle,minTotal,depth+1,loc+1,curSum);curSum -= triangle[depth][loc+1];}private:int triangleHeight;};
在小数据集上运行良好,但是大数据集上就不行了,归根结底,深度遍历一方面有重复计算,一方面有递归消耗,再加上是个O(N2)的算法,必定会很慢,不过深度遍历的算法很直观,可以作为进一步分析的基础。既然知道深度搜索不行,那么该怎么办呢,我们发现,其实这个三角是有很强的最优子结构的,分析如下:
如果最短路径通过第i层(最上一层为0层,第一个元素标号为0)的第j个元素,那么必然有最短路径通过第i层的第j-1或者第j个元素,这种二选一的情形是由题意限定的,对于每一层的首尾需特殊处理,如果最短路径通过i层的首尾元素,说明最优路径在上一层的节点已经确定。于是,若已知截止于第i-1层的各个元素的最短路径和SUMi-1(SUM为长度为i的数组),那么截止于第i层的最短路径和SUMi的每个元素可以按照如下公式计算:
- SUMi[j] = min(SUMi-1[j-1],SUMi-1[j]) +triangle[i][j] 若 j>0且j<i
- SUMi[0] = SUMi-1[0]+triangle[0][0];
- SUMi[i] =SUMi-1[i-1] +triangle[i][i];
于是有了以下的代码:
class Solution {public:int minimumTotal(vector<vector<int> > &triangle) {// Start typing your C/C++ solution below// DO NOT write int main() function//areslipan@163.comint triangleHeight = triangle.size();if(triangleHeight==0)return 0;//申请一个长度为n的辅助空间,作为动态规划的备忘表//备忘表被循环利用,第i个循环中只有前i个元素有意义,存放的是遍历到第i层的最佳路径对应的最小值vector<int> mmtTable;mmtTable.assign(triangleHeight,0);mmtTable[0]= triangle[0][0];int tmp = 0;for(int i = 1;i<triangleHeight;++i){//特殊处理每一层的第一个元素,因为第一个元素的上一个节点一定是上一层的第一个元素int cur = mmtTable[0];mmtTable[0] = cur + triangle[i][0];//第i层的中间节点j可能上一层节点是第i-1层的j-1和j个节点for(int j=1;j<i;++j){tmp = mmtTable[j];mmtTable[j] = min(cur,mmtTable[j])+triangle[i][j];cur = tmp;}//特殊处理每一层的最后一个元素,因为最后一个元素的上一个节点一定是上一层的最后一个元素mmtTable[i] = cur+triangle[i][i];}vector<int>::iterator iter;int minTotal = mmtTable[0];for(iter = mmtTable.begin();iter!=mmtTable.end();++iter){if((*iter)<minTotal)minTotal = *iter;}return minTotal;}};
leetcode—triangle的更多相关文章
- [LeetCode] Triangle 三角形
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- leetcode — triangle
/** * Source : https://oj.leetcode.com/problems/triangle/ * * * Given a triangle, find the minimum p ...
- [leetcode]Triangle @ Python
原题地址:https://oj.leetcode.com/problems/triangle/ 题意: Given a triangle, find the minimum path sum from ...
- LeetCode - Triangle
题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...
- LeetCode -- Triangle 路径求最小和( 动态规划问题)
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- leetcode Triangle及其思考
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- LeetCode Triangle 三角形(最短路)
题意:给一个用序列堆成的三角形,第n层的元素个数为n,从顶往下,每个元素可以选择与自己最近的两个下层元素往下走,类似一棵二叉树,求最短路. [], [,4], [6,,7], [4,,8,3] 注意: ...
- LeetCode: Triangle 解题报告
Triangle Given a triangle, find the minimum path sum from top to bottom. Each step you may move to a ...
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- 压力测试之apache benchmark
ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求.前段时间看到 ...
- 使用Github总结
1. 使用Git GUI 首先熟悉一下GUI,如下: 第一步,首先将代码fork到自己的版本库下面,如下: 并获取clone URL,如下图: 然后点击GUI克隆已有版本库,如下图: 点击克隆就可以得 ...
- 关于TFTLCD硬件接口和驱动的问题
在设计TFTLCD液晶硬件驱动电路的时候,我们会发现TFTLCD裸屏(买来的最初元件)的接口并非相似,所以导致驱动电路设计需要有些差别. TFTLCD液晶的本质 ...
- webView 加载本地文件 - html/htm pdf docx tx
- (void)viewDidLoad { [super viewDidLoad]; [self setupUI]; NSString *path = [[NSBundle mainBundle] p ...
- 关于xcode6打包以及上线前企业部署测试的说明 --转自张诚教授微博
xcode6如何打包 首先clean然后点击归档 点击打包之后保存 点选第一个以后检查相关证书签名 那么我们开发完以后,在上线前如何给别人测试 有2种方法 1.使用299美金的企业开发者账号搭建企业部 ...
- Git Commit Template 提交模板
多人协作开发一个项目时,版本控制工具是少不了的,git是linux 内核开发时引入的一个优秀代码管理工具,利用它能很好使团队协作完成一个项目.为了规范团队的代码提交,也方便出版本时的release n ...
- Android 绘制计时器
用小米的手机,发现其实还可以,无意间点开小米的计时器,发现界面非常好看和实用.于是自己仿照着写一个,由于技术不好,代码整体结构上可能有点乱,但主要的实现功能和掌握知识点. Android中绘制采用ca ...
- 1013: [JSOI2008]球形空间产生器sphere
很直观的一个gauss题: 用的是以前用过的一个模板: #include<cstdio> #include<algorithm> #include<cmath> # ...
- SQL分组查询GroupBy
一.分组查询1.使用group by进行分组查询在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:〉被分组的列〉为每个分组返回一个值得表达式 ...
- CF Rook, Bishop and King
http://codeforces.com/contest/370/problem/A 题意:车是走直线的,可以走任意多个格子,象是走对角线的,也可以走任意多个格子,而国王可以走直线也可以走对角线,但 ...