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,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- java 调用oracle 分页存储过程 返回游标数据集
1.分页类 package org.zh.basic; /** * 页面类 * * @author keven * */ public class PageInfo { // 定义 private S ...
- Oracle RAC备份异机单实例恢复演练
本文只节选了操作方案的部分章节: 3. 操作步骤 3.1. 异机单实例Oracle数据库软件安装 在异机上进行单实例Oracle数据库软件安装.该步骤过程不再本文中重复描述,如果对安装过程存在疑问 ...
- 制作进度条(UISlider)
怎样判断是否应当使用进度条 用进度条的主要目的是为了用一根管子的充满程度来直观地表示某种数值的百分比,进度条分为可拖动和不可拖动两种. 可拖动进度条和不可拖动进度条的原理几乎是一模一样,唯一的区别是可 ...
- nodejs基础安装
安装Nodejs需要从官网上下载一个最新的安装包,运行.我这里是win764位系统. 下载版本6.5.0 由于去外国的镜像上下载东西比较慢,淘宝为我们准备了国内的镜像.我们需要安装国内镜像的使用工具. ...
- IDEA的使用
1.设置字体file->setting->color$fonts->font 保存提示设置file->Settings -> Editor -> General - ...
- vs2013下使用Assist X的破解方法
Assist X的破解下载:http://pan.baidu.com/s/1kTnDH23 密码:j9jp 01.安装,点击VA_X_Setup2042.exe 安装 02.破解 找到这样的目录:C: ...
- bitset学习小记
Cplusplus官网的资料: http://www.cplusplus.com/reference/bitset/bitset/ http://www.cplusplus.com/reference ...
- easyui源码翻译1.32--Droppable(放置)
前言 使用$.fn.droppable.defaults重写默认值对象.下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3.2 * *翻译:lbq --放置 拉伸 */ (fun ...
- SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-001- DispatcherServlet的高级配置(ServletRegistration.Dynamic、WebApplicationInitializer)
一. 1.如想在DispatcherServlet在Servlet容器中注册后自定义一些操作,如开启文件上传功能,则可重写通过AbstractAnnotationConfigDispatcherSer ...
- ANDROID_MARS学习笔记_S01原始版_009_下载文件
一.代码1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...