1. 程式人生 > 實用技巧 >120. 三角形最小路徑和-7月15日

120. 三角形最小路徑和-7月15日

題目

120. 三角形最小路徑和

我的思路

首先很自然想到深搜和廣搜,不過時間複雜度應該相對比較高,2^n,深搜可以用遞迴實現,廣搜可以藉助一個佇列實現。 然後想到用動態規劃,可是沒有找到從上往下遞推的狀態轉移方程(比如抵達第n級的最小路徑和與抵達n-1級或者更小的最短路徑和之間的關係)。因為可能存在某條路徑在n-1級之前都不是最短路徑和。 又想辦法找反方向從下往上的遞推方程。同樣相鄰或者不同兩級到最底層的最短路徑沒有什麼關聯。不過在思考的時候發現:如果知道第n級相鄰兩個節點到最後一級的最短路徑和,那麼第n-1級與這兩個節點有連線的節點到達最底層的最短路徑會經過兩個節點的路徑較小的那一個。基於這個思想從上往下或者從下往上遞推都可以,並且空間複雜度為n,只需要一個大小為n的輔助陣列儲存當前推導的層的每個節點到最低層的最短路徑和或者最頂層到當前層每個節點的最短路徑和。 從下往上遞推比從上往下遞推少一次求陣列中最小元素的過程。 狀態轉移公式是:P[i] = min(P[i],P[i+1]) + Triangle[j][i]

我的實現

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        vector<int> shortestPathSum(triangle.size()+1,0);
        printf("triangle.size:%d\n",triangle.size());
        for(int i=triangle.size()-1;i>=0;i--){
            for(int j=0;j<triangle[i].size();j++){
                shortestPathSum[j]
=min(shortestPathSum[j],shortestPathSum[j+1])+triangle[i][j]; } } return shortestPathSum[0]; } }; /* 1.首先很自然想到深搜和廣搜,不過時間複雜度應該相對比較高,2^n,深搜可以用遞迴實現,廣搜可以藉助一個佇列實現。 2.然後想到用動態規劃,可是沒有找到從上往下遞推的狀態轉移方程(比如抵達第n級的最小路徑和與抵達n-1級或者更小的最短路徑和之間的關係)。因為可能存在某條路徑在n-1級之前都不是最短路徑和。 3.又想辦法找反方向從下往上的遞推方程。同樣相鄰或者不同兩級到最底層的最短路徑沒有什麼關聯。不過在思考的時候發現:如果知道第n級相鄰兩個節點到最後一級的最短路徑和,那麼第n-1級與這兩個節點有連線的節點到達最底層的最短路徑會經過兩個節點的路徑較小的那一個。基於這個思想從上往下或者從下往上遞推都可以,並且空間複雜度為n,只需要一個大小為n的輔助陣列儲存當前推導的層的每個節點到最低層的最短路徑和或者最頂層到當前層每個節點的最短路徑和。 11 9,10 7,6,10
*/

拓展學習