题目描述
给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字,
例如,给出的三角形如下:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
最小的从顶部到底部的路径和是2 + 3 + 5 + 1 = 11。
- 刚拿到这个题目你是什么心态呢?
没看清楚题意的我拿到这个题目首先想的就是先对二维数组的每一行数据从小到大的进行排序,最后将每一行的第一列加起来的结果就是矩阵中每一行最小数相加的结果,但是仔细一看题目我发现我错了.题目中要求的是按路径求最小和,不是简单的进行相加.
解题思路
- 申请一个同样大小空间的二维数组
- 将每一步累加的结果记录到其中 (需要注意边界的处理)
- 遍历每一种可能的路径,将每一条路径的和进行统计累加在最后一行中.最后再最后一行中找到最小的值,便是我们要找的路径和最小的结果了
解题流程
- 边界处理
- 三角形直角路径处理
- F(i,0)=F(i-1,0) + a[i][0];
- 三角形斜边路径处理
- F(i,i) = F(i-1,i-1) + a[i][i];
- 处理中间路径情况
- 图示
- 需要从第三行第二列开始处理,
- F[i][j] = F[i-1][j] + a[i][j];
代码实现
class Solution {
public:
int minimumTotal(vector<vector<int> > &triangle) {
if(triangle.empty()){
return 0;
}
vector<vector<int>> minPath(triangle);
int row=triangle.size();
//直角边界的处理
for(int i=1;i<row;i++){
minPath[i][0]=triangle[i][0]+minPath[i-1][0];
}
//斜边边界的处理
for(int i=1;i<row;i++){
minPath[i][i]=minPath[i-1][i-1]+triangle[i][i];
}
//中间路径的处理
for(int i=2;i<row;i++){
for(int j=1;j<i;j++){
minPath[i][j]=min(minPath[i-1][j],minPath[i-1][j-1])+triangle[i][j];
}
}
int minRet=minPath[row-1][0];
//从最小矩阵最后一行中寻找符合条件的结果
for(int j=1;j<row;j++){
minRet=min(minPath[row-1][j],minRet);
}
return minRet;
}
};