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 + 下面一层进入该节点的两个分支。
代码:
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 + 下面一层进入该节点的两个分支。
相关文章推荐
- 找素数 素数就是不能再进行等分的整数。比如:7,11。而9不是素数,因为它可以平分为3等份。
- FTPrep, 82 Remove Duplicates from Sorted List II
- FTPrep, 33 Search in Rotated Sorted Array
- 【leetcode】Array——Triangle(120)
- c# Array或List有个很实用的ForEach方法,可以直接传入一个方法对集合中元素操作
- ftp文件上传,可以上传至非根目录的指定目录,并解决文件中文无法上传问题,返回文件路径
- FTPrep, 83 Remove Duplicates from Sorted List
- 找素数 素数就是不能再进行等分的整数。比如:7,11。而9不是素数,因为它可以平分为3等份。
- FTPrep, 114 Flatten Binary Tree to Linked List, comment中有总结,值得一看
- 【LeetCode111-120】很多道二叉树的问题(左右顺序很重要),一道hard DP题,两道杨辉三角以及一道DP三角
- 一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。 例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3 你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得
- 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用,不过要注意的是线程间需要做好同步。
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中
- FTPrep, 118 Pascal's Triangle
- FTPrep, 19 Remove Nth Node From End of List
- FTPrep, 119 Pascal's Triangle II
- 如何解决在java开发中java代码和jsp页面中出现路径因为项目名称的变化(也就是应用名)的问题?
- Unity中用到的C#补充(四)- Array,ArrayList,List,Drictionary,Hashtable
- Leetcode 120 Triangle 三角形最小路径和
- 因为CGRect,CGPoint等不是NSObject的子类,因此不能够直接添加到NSMutableArray中,所以要先将其转换成NSObject的子类。NSValue类可以解决这个问题,见NSVa