题目描述:
思路:动态规划!每一步只能往下或者往右下前进,那么就能很简单得到状态和转换方程进而得到结果。另外由于状态转换只涉及到上一行,所以可以用两个长度为三角形总行数的数组来替代整个状态转换矩阵。但是如何能够用O(n)来得到结果?可以注意到,每行最后一个位置只能由上一行最后一个位置得到。每个元素都是其上一行的当前元素和前一个元素决定的。每行第一个元素都是上一行第一个元素确定的。那么只需要在每行进行时候进行从大到小确认每个元素就可以用一个数组得到结果。要注意的是每行第一个元素一定是要最后改变。
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int n=triangle.size();//行数
int[] tem=new int[n];
tem[0]=triangle.get(0).get(0);
for(int i=1;i<n;i++){
tem[i]=triangle.get(i).get(i)+tem[i-1];
for(int j=i-1;j>0;j--){
tem[j]=Math.min(tem[j],tem[j-1])+triangle.get(i).get(j);
}
tem[0]+=triangle.get(i).get(0);
}
int result=Integer.MAX_VALUE;
for(int i=0;i<n;i++){
result=Math.min(result,tem[i]);
}
return result;
}
}
运行结果:
官方代码的运行结果:
为什么会比官方慢呢。官方最后遍历得到最小值时候直接赋值为tem[0],并且循环从1开始。而自己是赋值为Integer.MAX_VALUE,遍历从0开始。就是这么个原因。。。。