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) {
-
-
- 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) {
-
-
- 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;
- }