LeetCode---Triangle
2015-10-19 22:18
239 查看
题目大意:给出一个三角形数组,求出从顶部到底部的最小路径和。
算法思想:
1.采用一个2维数组记录从顶部到当前位置的最小路径和。(滚动数组的原理)
2.遍历三角形数组,对于当前位置的最小路径和有3种情况。
(1)处于三角形的内部,则V[1][j]=min(V[0][j],V[1][j-1])+triangle[i][j].
(2) 处于三角形的左边界,则V[1][j]=V[0][j]+triangle[i][j];
(3) 处于三角形的右边界,则V[1][j]=V[0][j-1]+triangle[i][j];
3.注意遍历数组最后一行时,V不滚动。
4.遍历V[1][i],找出最小路径和。
代码如下:
算法思想:
1.采用一个2维数组记录从顶部到当前位置的最小路径和。(滚动数组的原理)
2.遍历三角形数组,对于当前位置的最小路径和有3种情况。
(1)处于三角形的内部,则V[1][j]=min(V[0][j],V[1][j-1])+triangle[i][j].
(2) 处于三角形的左边界,则V[1][j]=V[0][j]+triangle[i][j];
(3) 处于三角形的右边界,则V[1][j]=V[0][j-1]+triangle[i][j];
3.注意遍历数组最后一行时,V不滚动。
4.遍历V[1][i],找出最小路径和。
代码如下:
class Solution { public: int minimumTotal(vector<vector<int>>& triangle) { int n=triangle.size(); if(n==0) return 0; if(n==1) return triangle[0][0]; int V[2] ; memset(V,0,sizeof(V)); V[0][0]=triangle[0][0]; for(int i=0;i<n;++i){ if(i==0) continue; for(int j=0;j<=i;++j){ if(j!=0&&i!=j) V[1][j]=min(V[0][j-1],V[0][j])+triangle[i][j]; if(j==0) V[1][j]=V[0][j]+triangle[i][j]; if(i==j) V[1][j]=V[0][j-1]+triangle[i][j]; } if(i==n-1) break; for(int k=0;k<n;++k){ V[0][k]=V[1][k]; V[1][k]=0; } } int Min=V[1][0]; for(int i=1;i<n;++i){ if(V[1][i]<Min) Min=V[1][i]; } return Min; } };
相关文章推荐
- find函数
- 清除Android工程中没用到的资源
- ios开发如何让navigationItem自带的返回按钮设置成图片或者不显示文字
- Android 学习(一)
- CodeIgniter中驱动器的使用方法
- swt嵌套swing
- 基于Linux C语言的字符界面《推箱子》
- Linux head 命令 【转载】
- Android 触摸及手势操作GestureDetector
- 学员真正想要的UI设计培训公开课
- 国外的一些优秀单页滚动页面设计分享
- 一篇随笔
- java同步关键字Synchronized 的实现原理
- 菜鸟学算法之POJ1636 Prison Rearrangement
- WHY YOUR PRIVATE CLOUD COULD LOOK A LOT LIKE PAAS
- hdu2103 Family planning
- 学习小记(2015/10/19)——工作中遇见的一个关于jQuery选择器的小要点。
- Bentley.PULS.XM.V8.9.0.28 数字管道脉动分析/海洋结构DNV sesam suite 2013 Full 1CD
- 滴滴打车交互设计详细分析
- 顺序栈-C++实现