您的位置:首页 > 其它

Triangle

2015-11-01 19:22 323 查看
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

[cpp] view
plaincopyprint?

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?

[cpp] view
plaincopyprint?

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: