leetcode-華為專題-120. 三角形最小路徑和
阿新 • • 發佈:2021-08-17
第一種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; } };