1. 程式人生 > 其它 >leetcode-華為專題-120. 三角形最小路徑和

leetcode-華為專題-120. 三角形最小路徑和

第一種dfs,用例還剩最後一個超時了

class Solution {
public:
    int res = INT_MAX;
    // int m = 0;
    // int n = 0;
    int minimumTotal(vector<vector<int>>& triangle) {
        // m = triangle.size()-1;
        // n = triangle[0].size()-1;
        dfs(triangle,0,0,0);
        return res;
    }

    void dfs(vector<vector<int
>>& triangle, int sum, int i, int j){ int m =triangle.size()-1; int n = triangle[i].size(); // cout<<"m: "<<m<<" n: "<<n<<endl; // cout<<"i: "<<i<<" j: "<<j<<endl; if(i>m||j>n)
return; if(i==m){ sum = sum + triangle[i][j]; res = min(res, sum); //cout<<"res: "<<res<<endl; return; } sum = sum + triangle[i][j]; if(sum>=res) return; dfs(triangle,sum,i+1,j); dfs(triangle,sum,i
+1,j+1); } };

第二種動態規劃:

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int n = triangle.size();
        vector<vector<int>> f(n, vector<int>(n));

        // f[i][j] 含義:從頂部到i行j列的最小路徑和
        // base case
        f[0][0] = triangle[0][0]; // 第一個只有一個元素,f[0][0]就等於此元素
        for(int i = 1; i < n; i++){
            f[i][0] = f[i - 1][0] + triangle[i][0]; // 每一行最左側=上一行最左側 + 元素
            f[i][i] = f[i - 1][i - 1] + triangle[i][i]; //最右側 = 上一行最右側 + 元素
        }
        for (int i = 1; i < n; ++i) {
            for (int j = 1; j < i; ++j) {
                // 此步在(i,j),上一步就只能在位置(i−1,j−1)或者位置 (i−1,j)。
                f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + triangle[i][j];
            }
        }
        // 最終的答案即為 f[n−1][0]到f[n−1][n−1]中的最小值,
        int res = INT_MAX;
        for(int i = 0; i < f[n-1].size();i++){
            res = min(res, f[n-1][i]);
        }
        // return *min_element(f[n - 1].begin(), f[n - 1].end());
        return res;
    }
};