三角形最小路径和
最开始的方法:自上向下
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int si = triangle.size();
int[][] arr = new int[si][si];
arr[0][0] = triangle.get(0).get(0);
for(int i=1;i<si;i++){
arr[i][0] = triangle.get(i).get(0)+arr[i-1][0];
for(int j=1;j<i;j++){
arr[i][j] = Math.min(arr[i-1][j-1],arr[i-1][j])+triangle.get(i).get(j);
}
arr[i][i] = triangle.get(i).get(i)+arr[i-1][i-1];
}
int ans = arr[si-1][0];
for(int i=0;i<si;i++){
ans = Math.min(arr[si-1][i],ans);
}
return ans;
}
}
方法二:自底向上
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int si = triangle.size();
int[][] arr = new int[si][si];
for(int i=si-1;i>=0;i--){
arr[si-1][i] = triangle.get(si-1).get(i);
}
for(int i=si-2;i>=0;i--){
for(int j=i;j>=0;j--){
arr[i][j] = Math.min(arr[i+1][j+1],arr[i+1][j])+triangle.get(i).get(j);
}
}
return arr[0][0];
}
}
方法三:改良方法二,长度加一,不用初始化底部。
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int si = triangle.size();
int[][] arr = new int[si+1][si+1];
for(int i=si-1;i>=0;i--){
for(int j=i;j>=0;j--){
arr[i][j] = Math.min(arr[i+1][j+1],arr[i+1][j])+triangle.get(i).get(j);
}
}
return arr[0][0];
}
}