Pascal's Triangle

题目链接:Pascal’s Triangle

Given numRows, generate the first numRows of Pascal’s triangle.
For example, given numRows = 5,
Return

1
2
3
4
5
6
7
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]

这道题比较简单,属于基础的数组操作。知道规律就好做了,它的规律如下:
1.每行的元素个数等于行数
2.每行的第一个元素和最后一个元素等于1
3.第三行起,每行除第一个和最后一个元素外之间的元素第i行第k个元素 = 行数i-1行第k个元素 + 行数i-1行第k-1元素
4.隐藏条件:当行数i和元素j的下表相等时 ,i行的第j个元素等于1
具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//方法一
public static List<List<Integer>> generate(int numRows){
List<List<Integer>> triangle = new ArrayList<>();
if(numRows <= 0){
return triangle;
}

for (int i = 0; i < numRows; i++) {
List<Integer> row = new ArrayList<>();
for (int j = 0; j < i+1; j++) {
if(j ==0 || j == i){
row.add(1);
}else {
row.add(triangle.get(i-1).get(j-1) + triangle.get(i-1).get(j));
}
}
triangle.add(row);
}
return triangle;
}


//方法二
public static int[][] pascal(int rowNums){
if(rowNums<=0)
return new int[1][1];

int[][] arr = new int[rowNums][];
for (int i = 0; i < rowNums; i++){
arr[i] = new int[i+1];
for (int j = 0; j < i+1; j++){
if(j == 0 || j == i){
arr[i][j] = 1;
}else {
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
}
return arr;
}

算法时间复杂度应该是O(1+2+3+…+n)=n(n-1)/2=O(n^2),空间上只需要二维数组来存储结果,不需要额外空间。