分为三种情况。
(1)numRows 为 0,return 【】;
(2)numRows <=2,都为1;
(3)numRows>2,除了第0位和第numRows-1位为1,其他第i位的值都为第numRows-1层第i位和第i+1的和。
非递归实现
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> list = new ArrayList<>(numRows);
for (int i = 0; i < numRows; i++) {
List<Integer> l1 = new ArrayList<>(i + 1);
for (int j = 0; j < i + 1; j++) {
if (j == 0 || j == i)
l1.add(1);
else
l1.add(list.get(i - 1).get(j - 1) + list.get(i - 1).get(j));
}
list.add(l1);
}
return list;
}
递归实现
public List<List<Integer>> generate_Recu(int numRows) {
if(numRows==0)
return new ArrayList<>();
if(numRows==1) {
List<List<Integer>> list = new ArrayList<>();
List<Integer> l = new ArrayList<>(numRows);
l.add(1);
list.add(l);
return list;
}
else {
List<List<Integer>> list = generate_Recu(numRows-1);
List<Integer> l = new ArrayList<>(numRows);
for(int i=0;i<numRows;i++) {
if(i==0 || i==numRows-1)
l.add(1);
else {
l.add(list.get(numRows-2).get(i-1)+list.get(numRows-2).get(i));
}
}
list.add(l);
return list;
}
思路和上边的是一样的,在这里求第i层第j个元素时用了pre来存储上一层的第j-1个元素,temp存储上一层的第j个元素,然后再将temp的值赋值给pre,因为同一层第j-1个元素的temp就是第j个元素的pre。
public List<Integer> getRow(int rowIndex){
List<Integer> list = new ArrayList<>(rowIndex);
list.add(1);
if(rowIndex==0)
return list;
int pre = 1;
for(int i=1;i<rowIndex+1;i++) {
for(int j=1;j<i;j++) {
int temp = list.get(j);
list.set(j, pre+temp);
pre = temp;
}
list.add(1);
}
return list;
}