您的位置:首页 > 编程语言 > PHP开发

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

2017-10-08 04:21 288 查看
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 + 下面一层进入该节点的两个分支。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐