Given a non-negative integer numRows, generate the first numRows of Pascal's triangle.
In Pascal's triangle, each number is the sum of the two numbers directly above it.
Example:
Input: 5
Output:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
取巧的解法:
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result = new LinkedList();
if(numRows <= 0) return result;
List<Integer> row = new ArrayList();
for(int i = 0; i < numRows; i++) {
row.add(0, 1);
for(int j = 1; j < row.size() - 1; j++) {
//java没有这样的操作
//row.get(j) = row.get(j) + row.get(j+1);
row.set(j, row.get(j)+row.get(j+1));
}
result.add(new ArrayList(row));
}
return result;
}
}
上面的解法有一个问题是:row.add(0, 1)的时候,都会对row中所有的元素移动,这样做效率很低。
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result = new LinkedList();
if(numRows <= 0) return result;
List<Integer> row = new ArrayList();
for(int i = 0; i < numRows; i++) {
row.add(1);
for(int j = i-1; j > 0; j--) {
row.set(j, row.get(j)+row.get(j-1));
}
result.add(new ArrayList(row));
}
return result;
}
}
问题说明:
我们仔细研究上面的算法就会发现,在计算过程中是用到了memoization 优化计算的,中间计算结果进行存储,不需要重复计算。
这个帕斯卡三角问题,还有两个变形题
(1)某一行的所有值 Pascal's Triangle II(LeetCode)
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> row = new ArrayList();
for(int i = 0; i <= rowIndex; i++) {
row.add(1);
for(int j = i-1; j > 0; j--) {
row.set(j, row.get(j)+row.get(j-1));
}
}
return row;
}
}
(2)某一行某一列的值。这道题很容易想到用递归的方式来做,不过会遇到重复计算中间结果值的问题。不过,这是有解决办法的。核心思想还是采用memoization优化技术
这道题和斐波那契数列求某个位置的值是一类型的题
top-down
public int getValue(int rowIndex, int colIndex) {
List<Integer> row = new ArrayList();
for(int i = 0; i <= rowIndex; i++) {
row.add(1);
for(int j = i-1; j > 0; j--) {
row.set(j, row.get(j)+row.get(j-1));
}
}
return row.get(colIndex);
}
bottom-up: 以后有机会写