给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
解题
1.首先,们知道必须要一个numRows的循环。其次是内层循环。本题的时间复杂度O(n^2)。空间复杂度亦同。
2.方法要求返回List数组对象。所以我们返回的是List的子类对象。考虑到Integer类已经实现了Compareble接口,那么加入到List中的对象会被排序。但是这个事情不会发生,因为要调用Colloection.sort(list)才会排序。所以能够保证我们的添加顺序。
3.起始&结束位子的判断。我们是根据前一行来生成后一行的数据,所以在第一行的时候,我们先初始化一个[1]数组。而结束的时候,最后一个数据,是上一个数组的最后一个数字加0.
4.每行的首个数组成员是1.
代码
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
for (int i = 0; i < numRows; i++){
if(i == 0) {// init first row
List<Integer> subList = new ArrayList<Integer>();
subList.add(1);// prefix number 1
result.add(subList);
continue;
}
/*if(i == 1){// init second row
List<Integer> subList = new ArrayList<Integer>();
subList.add(1);// prefix number 1
subList.add(1);// pubfix number 1
result.add(subList);
continue;
}*/
List<Integer> subList = result.get(i-1);
List<Integer> newList = new ArrayList<Integer>();
newList.add(1);
for(int j = 0; j < subList.size(); j++){
int next = (j+1)>=subList.size() ?0 : subList.get(j+1);
newList.add(subList.get(j)+ next);
}
//newList.add(1);// subfix number 1
result.add(newList);
}
return result;
}
}