Question
Given numRows, generate the first numRows of Pascal’s triangle.
For example:
given numRows = 5
Return
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
Idea
给定行数,生成指定行数的Pascal’s triangle(又称,杨辉三角)。
直接使用Pascal三角的生成方式进行解题.
Java- 使用
ArrayList<List<Integer>>
结构存储将要返回的Pascal三角的所有行; - 使用
ArrayList<Integer>
结果存储单行.
Python
- 使用Python中的list存储Pascal三角,和Java的结构相同。
- 使用
Code
ArrayList—Java
public class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> allrows = new ArrayList<List<Integer>>();
ArrayList<Integer> row = new ArrayList<Integer>();
for (int i=0; i<numRows; i++){
row.add(0,1);
for(int j=1; j<row.size()-1;j++){
row.set(j, row.get(j)+row.get(j+1));
}
allrows.add(new ArrayList<Integer>(row));
}
return allrows;
}
}
生成Pascal三角主要包括三个过程:
- 首先生成行,利用ArrayList的add()方法,对首位添1—
row.add(0,1)
; - 对从第三行开始的行,利用已经生成好的行(这里相当于是上一行元素)进行相应元素的替换,利用set()方法;
- 将生成的行添加到Pascal三角的ArrayList
<List<Integer>>
结构中.
List—Python
class Solution(object):
def generate(self, numRows):
"""
:type numRows: int
:rtype: List[List[int]]
"""
L = [[1]]
if numRows < 1:
return []
if numRows == 1:
return L
i = 1
while i < numRows:
L.append([sum(res) for res in zip([0]+L[i-1],L[i-1]+[0])])
i = i + 1
return L
- 通过观察Pascal三角的结构,从第三行开始,其每一行的list,等于前一行的list分别在首位添1和在末位添1对应位相加所得的结果;
- 这里使用Python内建函数zip()对两个list进行对应位置的组合相加;
- 利用Python编写的该方法目前在执行时间上耗费较大,LeetCode目前运行时间:85ms,3.13%的beats率。