120. 三角形最小路径和

https://leetcode-cn.com/problems/triangle/solution/zi-di-xiang-shang-dong-tai-gui-hua-lei-si-yu-cong-/

 思路:


[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
为例:

假设从倒数第二列开始,

,6变成6+min(4,1)=7,5变成5+min(1,8)=6,7变成7+min(8,3)=10;这应该很好理解,当你选择的路径让你到达6时,接下来你可以选择4或者1,那么你自然会选择更小的1;当你选择的路径让你到达5时,接下来你可以选择1或者8,那么你自然会选择更小的1;当你选择的路径让你到达7时,接下来你可以选择8或者3,那么你自然会选择更小的3。

因此,可以把原来的lists变成
[
[2],
[3,4],
[7,6,10],
[4,1,8,3]
]

继续向上操作,即操作倒数第三行,可以把lists变成
[
[2],
[9,10],
[7,6,10],
[4,1,8,3]
]

继续向上操作,即操作倒数第四行,可以把lists变成
[
[11],
[9,10],
[7,6,10],
[4,1,8,3]
]

最后,返回顶部的值。

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        if(triangle==null||triangle.size()==0) return 0;
        int [][]dp=new int [triangle.size()+1][triangle.size()+1];//初始化所有节点为零,这样最后一行无需初始化,在这里我们不直接操作原List。
        for(int i=triangle.size()-1;i>=0;i--)//从最后一行开始,因为dp初始化的时候多了一行,多的一行都是0,不影响的
        {
            List<Integer> cur=triangle.get(i);//获得第i层
            for(int j=0;j<cur.size();j++)
            {
                dp[i][j]=Math.min(dp[i+1][j],dp[i+1][j+1])+cur.get(j);//当前层的元素,是下一层相邻元素里较小的那一个再加上本元素,下一层相邻元素,的下标是j,j+1
            }

        }
        return dp[0][0];

    }
}

  

原文地址:https://www.cnblogs.com/lzh1043060917/p/12880360.html