FTPrep: 120 Triangle,可以归为 pathSum 路径和的这类题,因为用到了list/array,就是一道DP题。

minPathSum represented in List 的题型,其实也是非常典型。从下往上,从后往前,从右到左。反向推导,其实非常make sense。细节看comment吧。

代码:

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int level=triangle.size(); // level=width;
        if(level==0) return 0;
        
        int[] record = new int[level];
        for(int i=0; i<level; i++) record[i]=triangle.get(level-1).get(i); // record the bottom level of the triangle. Yes, this is very good, making it easy to write the tranforming formula.
        for(int rowIndex=level-2; rowIndex>=0; rowIndex--){   // the power of naming!!! make it much easier for implementing and debugging
            for(int index=0; index<=rowIndex; index++){
                record[index] = Math.min(record[index],record[index+1])+triangle.get(rowIndex).get(index);
            }
        }
        return record[0];
    }
}

// 首先,这个问题是通过逆向思维,反方向得到的,这是一类典型的DP题么??是的!!北大算法课上讲过的!可以总结到DP问题里。
// 在实现上,外层循环是第一步,遍历每一层,因为底层实现设定好了,就不需要在for中遍历了,for中是从 len-2 到 0 开始遍历的。
// 每一层的每一个节点 都会被更新,那么横向来说,要经历 index:0 to level 这个范围,level-th 有level+1个元素,那么最后一个元素的index也就是level
// 每一层的每一个节点 更新的值(上面说得是范围的确定,就是for中index的确定)是由 triangle中的相应位置数+ record中的同等index 和 index+1 位置的较小值来确定的。
// 抽象的说:就是本来要构造一个 同样大小的 triangle,来记录每个点的最短路径,最终回到了原点就结束了。所以有两个动作:1,遍历triangle;2,比较进入这个节点的两条分支的大小;这里我省掉的时候构建一个同样的triangle,因为只有上一层的信息有用,所以用一个 array就够了。遍历的话,按照标准的row,col/index来命名。通过这两个参数来决确定

// 更简单的说:把三角形从下网上扫,从左往右扫;record用最底层进行初始化,每次跟新都需要用到 三角形中对应的点的value + 下面一层进入该节点的两个分支。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值