力扣120. 三角形最小路径和(java动态规划)

三角形最小路径和

力扣120. 三角形最小路径和(java动态规划)_第1张图片
这道题第一眼看可能就会想到使用动态规划来解答,定义一个dp[n][n]的数组,然后填写数组,若产生考虑两个值的情况——如图中的 5可以有两条路径到达,则选取较小值,代码难度不高。
但仔细一看,发现最好只是用 O[n] 的额外空间,其实,我们只需定义一个一维数组就能解决问题。
力扣120. 三角形最小路径和(java动态规划)_第2张图片
如图,我们只需定义一个 一维数组dp[n] 利用前一行,来更新当前行数的距离,这样就满足了题目要求 额外空间O(n)

class Solution {
    List<Integer> list;

    public int minimumTotal(List<List<Integer>> triangle) {
        int dp[] = new int[triangle.size()];
        //初始化第一位
        dp[0] = triangle.get(0).get(0);
        for(int i=1;i<triangle.size();i++){
            list = triangle.get(i);
            //这里需要注意,需要从后向前初始化,否则dp数组会在使用之前就改变
            for(int j=list.size()-1;j >= 0;j--){
            //除了每行第一个和最后一个,其他的都需要判断两条路径大小,并取较小值
                if(j == list.size()-1){
                    dp[j] = dp[j-1]+list.get(j);
                }else if(j == 0){
                    dp[j] = dp[j]+list.get(j);
                }else{
                    dp[j] = Math.min(dp[j]+list.get(j),dp[j-1]+list.get(j));
                }
            }
        }
        return findMIinum(dp);
    }
    //找数组中最大值
    public int findMIinum(int[] dp){
        int min = Integer.MAX_VALUE;
        for(int i=0;i<dp.length;i++){
            if(dp[i] < min){
                min = dp[i];
            }
        }
        return min;
    }
}

你可能感兴趣的:(力扣)