118.杨辉三角
# 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
# 在「杨辉三角」中,每个数是它左上方和右上方的数的和。
import copy
class Solution(object):
def generate(self, numRows):
"""
生成杨辉三角的前numRows行。
:type numRows: int - 输入的行数
:rtype: List[List[int]] - 返回一个包含杨辉三角前numRows行的列表的列表
"""
# 如果输入的行数为0,返回空列表
if numRows==0:
return []
# 如果输入的行数为1,返回包含第一行的列表
if numRows==1:
return [[1]]
# 如果输入的行数为2,返回包含前两行的列表
if numRows==2:
return [[1],[1,1]]
# 初始化结果列表,包含杨辉三角的前两行
res=[[1],[1,1]]
# 初始化当前行,从第三行开始计算
cur=[1,1]
# 从第三行开始,迭代生成杨辉三角的每一行
for i in range(2,numRows):#2~n-1<====>numRows(3~n)
# 深拷贝当前行,用于计算下一行
temp=copy.deepcopy(cur)
# 在当前行的末尾添加1
cur.append(1)
# 计算当前行中间的元素,头尾元素为1,不需要处理
for j in range(1,i):#头尾为1,不处理
cur[j]=temp[j-1]+temp[j]
# 深拷贝计算完成的当前行,用于结果存储
new=copy.deepcopy(cur)
# 将当前行添加到结果列表中
res.append(new)
# 返回生成的杨辉三角的前numRows行
return res
什么需要深拷贝?
深拷贝在该代码中的作用是确保当前行cur
的修改不会影响到之前存储的结果。具体原因如下:
- 避免引用共享问题:如果直接使用赋值(如
temp = cur
),temp
和cur
会指向同一个列表对象。后续对cur
的修改会同时影响到temp
,导致计算错误。 - 保持数据独立性:通过
copy.deepcopy(cur)
,创建了cur
的一个完全独立的副本temp
,这样可以在计算下一行时安全地使用temp
中的值,而不受cur
变化的影响。
#leecode
def generate(self, numRows):
"""
生成杨辉三角的前numRows行。
:type numRows: int - 输入的行数
:rtype: List[List[int]] - 返回一个包含杨辉三角前numRows行的列表的列表
"""
# 初始化结果列表,其中每一行包含相应数量的1
res = [[1] * i for i in range(1, numRows + 1)]
# 如果输入的行数小于等于2,直接返回初始化的结果列表
if numRows <= 2:
return res
# 从第三行开始,迭代生成杨辉三角的每一行
for i in range(1, numRows):
# 计算当前行中间的元素,头尾元素为1,不需要处理
for j in range(1, i):
res[i][j] = res[i - 1][j - 1] + res[i - 1][j]
# 返回生成的杨辉三角的前numRows行
return res