URL
https://leetcode.com/problems/triangle/description/
描述:
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[i][j] = min{dp[i-1][j-1],dp[i-1][j]}
注意边界情况
代码示例
public int minimumTotal(List<List<Integer>> triangle) {
if(triangle==null || triangle.size()==0) return 0;
int len = triangle.get(triangle.size()-1).size();
//我们使用两个数组减少空间开销
int[] dp1 = new int[len];
int[] dp2 = new int[len];
int temp=0;
for(int i=0;i<triangle.size();i++){
List<Integer> row = triangle.get(i);
for(int j=0;j<row.size();j++){
if(j == 0){
temp = dp1[j];
}else if(j == row.size()-1){
temp = dp1[j-1];
}else{
temp = Math.min(dp1[j-1],dp1[j]);
}
dp2[j] = temp + row.get(j);
}
for(int j=0;j<row.size();j++){
dp1[j] = dp2[j];
}
}
int min = Integer.MAX_VALUE;
for(int i=0;i<len;i++){
min = Math.min(min,dp1[i]);
}
return min;
}