題目描述
給出一個三角形,計算從三角形頂部到底部的最小路徑和,每一步都可以移動到下面一行相鄰的數字,
例如,給出的三角形如下:
[
[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;
}
};