[Leetcode]Triangle

来源:互联网 发布:易趣网和淘宝网的不同 编辑:程序博客网 时间:2024/06/06 01:40

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

[     [2],    [3,4],   [6,5,7],  [4,1,8,3]]

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

Note:
Bonus point if you are able to do this using only O(n) extra space, wheren is the total number of rows in the triangle.


class Solution {public:    /*algorihtm: dp    dp(i,j) = min{dp(i-1,j-1),dp(i-1,j))} + triangle(i,j)    time O(m*n) space O(m*n)    */    int minimumTotal(vector<vector<int>>& triangle) {        int m = triangle.size(),n = triangle[m-1].size();        vector<vector<int> >dp(m,vector<int>(n,0));        dp[0][0] = triangle[0][0];        for(int i = 1;i < m;i++){            int size = triangle[i].size();            for(int j = size - 1;j >= 0;j--){                if(j == size - 1)dp[i][j] = dp[i-1][j-1];                else if(j == 0)dp[i][j] = dp[i-1][j];                else{                    dp[i][j] = min(dp[i-1][j-1],dp[i-1][j]);                }                dp[i][j] += triangle[i][j];            }        }        int min = INT_MAX;        for(int i = 0;i < n;i++){            if(min > dp[m-1][i])min = dp[m-1][i];        }        return min;    }};

class Solution {public:    /*algorihtm: dp    dp(i,j) = min{dp(i-1,j-1),dp(i-1,j))} + triangle(i,j)    optimze space to O(n)    time O(m*n) space O(n)    */    int minimumTotal(vector<vector<int>>& triangle) {        int m = triangle.size(),n = triangle[m-1].size();        vector<int>dp(n,0);        dp[0] = triangle[0][0];        for(int i = 1;i < m;i++){            int size = triangle[i].size();            for(int j = size - 1;j >= 0;j--){                if(j == size - 1)dp[j] = dp[j-1];                else if(j == 0);//dp[j] = dp[j];                else{                    dp[j] = min(dp[j-1],dp[j]);                }                dp[j] += triangle[i][j];            }        }        int min = INT_MAX;        for(int i = 0;i < n;i++){            if(min > dp[i])min = dp[i];        }        return min;    }};


0 0
原创粉丝点击