给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点(容易理解错)上。
- 例如,给定三角形:
[
[2],
[3, 4],
[6, 5, 7],
[4, 1, 8, 3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。
class Solution {
public int minimumTotal(List<List<Integer>> tri) {
//自底向上的动态规划
int[][] dp = new int[tri.size()+1][tri.size()+1]; //多增加一行和一列可以省去初始化dp[tri.size()-1]这一行
for(int i = tri.size() - 1; i >= 0; i--){
for(int j = 0; j < tri.get(i).size(); j++){
dp[i][j] = tri.get(i).get(j) + Math.min(dp[i+1][j], dp[i+1][j+1]); //相邻的两个数
}
}
return dp[0][0];
}
}
//优化空间复杂度,仅使用一维数组
class Solution {
public int minimumTotal(List<List<Integer>> tri) {
//自底向上的动态规划
int[] dp = new int[tri.size()+1];
for(int i = tri.size() - 1; i >= 0; i--){
for(int j = 0; j < tri.get(i).size(); j++){
//一维数组保存这一层的数的三角形最小路径和,其中dp[j]与dp[j+1]代表相邻的两数
dp[j]= Math.min(dp[j],dp[j+1]) + tri.get(i).get(j) ;
}
//System.out.println(i + " - " + dp[i]);
}
return dp[0];
}
}
执行用时 : 5 ms, 在Triangle的Java提交中击败了74.78% 的用户
内存消耗 : 36.7 MB, 在Triangle的Java提交中击败了84.22% 的用户