leetcode_question_120 Triangle

来源:互联网 发布:innisfree 男士淘宝 编辑:程序博客网 时间:2024/05/16 10:30

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, where n is the total number of rows in the triangle.

dp:

2-dimension array, O(n^2) extra space

int minimumTotal(vector<vector<int> > &triangle) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        int row = triangle.size();        int col = triangle[row-1].size();                int ** dp = new int*[row];        for(int i = 0; i < row; i++)            dp[i] = new int[col];                    dp[0][0] = triangle[0][0];        for(int i = 1; i < row; ++i){            int vlen = triangle[i].size();            for(int j = 0; j < vlen; ++j){                if(j==0) dp[i][j] = dp[i-1][0] + triangle[i][0];                else if(j == vlen-1) dp[i][j] = dp[i-1][vlen-2] + triangle[i][vlen-1];                else{                    dp[i][j] = dp[i-1][j-1] < dp[i-1][j] ? dp[i-1][j-1] : dp[i-1][j];                    dp[i][j] += triangle[i][j];                }            }        }        int min = dp[row-1][0];        for(int j = 1; j < col; j++)            if(min > dp[row-1][j]) min = dp[row-1][j];                    for(int i = 0; i < row; ++i)            delete[] dp[i];        delete[] dp;        return min;    }

dp:

1-dimension array, O(n) extra space

row is equal to col, right?

int minimumTotal(vector<vector<int> > &triangle) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        int row = triangle.size();        int col = triangle[row-1].size();                int* dp = new int[col];                dp[0] = triangle[0][0];        for(int i = 1; i < row; ++i){            int tmp;            int vlen = triangle[i].size();            for(int j = 0; j < vlen; ++j){                if(j==0) { tmp = dp[0]; dp[j] = dp[0] + triangle[i][0];}                else if(j == vlen-1) dp[j] = tmp + triangle[i][vlen-1];                else{                    int res = tmp < dp[j] ? tmp : dp[j];                    res += triangle[i][j];                    tmp = dp[j];                    dp[j] = res;                                    }            }        }                int min = dp[0];        for(int j = 1; j < col; j++)            if(min > dp[j]) min = dp[j];                delete[] dp;        return min;    }