leetcode——杨辉三角
题目描述:
给定一个非负整数 numrows,生成杨辉三角的前 numrows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
来源:力扣(leetcode)
链接:https://leetcode-cn.com/problems/pascals-triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
我们先找规律,每一行的第一个数字和最后一个数字都为1,然后其余的数字都等于上一行同列的数字和上一行列数减一的数字相加之和。
我们定义一个列表,列表中的每个元素都是用来存储整型元素的列表。
首先我们判断参数numrows是不是为0,如果为0我们直接返回空列表。
如果numrows不为0,我们就先初始化杨辉三角的第一行,第一行只有一个数字,为1。
接下来我们从第二行开始遍历到numrows,我们在每一层循环中都new一个新的列表用来存储该行的数字,然后先把1存进去,然后我们存储上一行的列表,用于计算该行的数字。遍历该行第二个数字到倒数第二个数字,按照刚才找到的规律计算每一个数字。遍历完后我们在该行的末尾加上一个1。最后我们把存储该层数字的numrow列表加入到总列表中。
循环完所有层后,我们返回总列表triangle。
这里提供java和python的代码。
java代码:
class solution {
public list<list<integer>> generate(int numrows) {
list<list<integer>> triangle = new arraylist<list<integer>>();
if (numrows == 0)
return triangle;
triangle.add(new arraylist<integer>());
triangle.get(0).add(1);
for (int i = 2; i <= numrows; i){
list<integer> numrow = new arraylist<integer>();
list<integer> prerow = triangle.get(i - 2);
numrow.add(1);
for (int j = 1; j < i - 1; j){
numrow.add(prerow.get(j) prerow.get(j - 1));
}
numrow.add(1);
triangle.add(numrow);
}
return triangle;
}
}
leetcode测试结果:
python代码:
class solution(object):
def generate(self, numrows):
"""
:type numrows: int
:rtype: list[list[int]]
"""
triangle = []
if numrows == 0:
return triangle
triangle.append([1])
for i in range(2, numrows 1):
numrow = [1]
prerow = triangle[i - 2]
for j in range(1, i - 1):
numrow.append(prerow[j] prerow[j - 1])
numrow.append(1)
triangle.append(numrow)
return triangle
leetcode测试结果: