杨辉三角
题目描述:
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
我的答案
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
#定义listRow接收最后的结果
listrow = []
#先定义一个初始的数组
list = [0,1,0]
#before等于[0],使得每次产生的数组首个元素都等于0
befor = [0]
#如果传入的层数是0,直接返回[]
if numRows == 0:
return listrow
#控制层数
for i in range(numRows):
#接收listRow的第一个元素,以后每轮循环也加进来
listrow.append(list[1:-1])
#控制每一个元素的长度
for j in range(len(list) -1):
#将上一轮产生的数组的两两相加的元素存入befor
befor.append(list[j] + list[j + 1])
#print(list)
#数组最后补0,增加数组长度
befor.append(0)
#将上一次循环得到数组循环赋给list,进入下一次循环
list = befor
#将before恢复出厂设置
befor= [0]
return listrow
执行结果:通过
执行用时:32 ms, 在所有 Python3 提交中击败了64.60%的用户
内存消耗:14.9 MB, 在所有 Python3 提交中击败了83.59%的用户
通过测试用例:14 / 14
大佬答案:
大佬的速度和我的差不多,但是思路更清晰一些
大佬思路:
在杨辉三角中,每个数是它左上方和右上方的数的和。
题目给的这一句话提示就够了。稍微麻烦的是要考虑头尾为1的情况
那不如根据行创建对应全1的列表,然后在根据非边缘的值进行公式套用
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
#定义ret接收最后产生的数组
ret = []
#从1到numRows,控制层数
for i in range(1, numRows + 1):
#创建一个有i个全为1的数组
tmp = [1 for _ in range(i)]
#循环控制每层的数量
for j in range(1, len(tmp) - 1):
# 这里注意是 i - 2
#让tmp = 上一层的数组的两数之和
#i - 2的原因是因为i是从1开始的,数组是下标从零开始,
#当i为1的时候并没有进入这一轮for循环
tmp[j] = ret[i - 2][j - 1] + ret[i - 2][j]
ret.append(tmp)
return ret
<变量> for i in range(N)“的作用是”<变量> 随着i对range的遍历而产生N-1个这个<变量>
如下举例:
tmp = [[] for i in range(4)]
执行结果为:使 []循环产生4次。即在输入
tmp = [[] for i in range(4)]
tmp后输出为:[[], [], [], []]