triangle = [[1], [1, 1]]
for i in range(2, 6):
cur = [1] #current当前
pre = triangle[i-1] #previous 先前的
for j in range(i - 1):
cur.append(pre[j] + pre[j+1]) # 前一行2项之和
cur.append(1)
triangle.append(cur)
print(triangle)
解法一变体:从第一行开始
triangle = []
n = 6
for i in range(n):
cur = [1]
triangle.append(cur)#[[1],[1,1]]
if i == 0: continue
pre = triangle[i-1]
for j in range(i - 1):
cur.append(pre[j] + pre[j+1]) # 前一行2项之和
cur.append(1)#[1,1]
print(triangle)
解法2 补零,for循环实现
n = 6
triangle = [[1],[1,1]]
for i in range(2,n):
newrow = triangle[i-1]
newrow.append(0)
row = [None] * (i+1)
for j in range(i+1):
row[j] = newrow[j-1] + newrow[j]
triangle.append(row)
print(triangle)
n = 6
newline = [1] # 第一行是特例,因为0+0不等于1
print(newline)
for i in range(1, n):
oldline = newline.copy() # 浅拷贝并补0
oldline.append(0) # 尾部补0相当于两端补0
newline.clear() # 使用append,所以要清除
for j in range(i+1):
newline.append(oldline[j - 1] + oldline[j])
print(newline)
triangle = [[1], [1, 1]] # 所有行
n = 10
for i in range(2, n): # 121
row = [1] * (i + 1) # 一次性开辟内存空间,效率更高
triangle.append(row)
for j in range(i//2): # i=4, range(2) => 0, 1
val = triangle[i-1][j] + triangle[i-1][j+1] # 1 3 3 1
row[j+1] = val
if i != 2*(j+1):# i == 2*(j+1) 中点,n=7出现过3次中点
row[-(j+2)] = val # 有可能被重置
print(triangle)
triangle = []
n = 6
for i in range(n):
row = [1] * (i + 1) # 一次开辟空间
triangle.append(row)
# i为0、1不进来
# i为2,range(1,2),j取1
# i为3,range(1,2),j取1
# i为4,range(1,3),j取1 2
for j in range(1, i//2+1):
val = triangle[i-1][j-1] + triangle[i-1][j]
row[j] = val
if i != 2 * j:
row[-j-1] = val
print(triangle)
解法4 单行覆盖
n = 6
row = [1] * n # 一次性开辟足够的空间
print(row)
print('-' * 30)
for i in range(n):
old = 1 # 相当于每行行首1,因为i从4开始就有覆盖了,引入这个变量
for j in range(i//2): # i为0,1不进入
val = old + row[j+1]
old = row[j+1]
row[j+1] = val
if i != 2 * (j+1):
row[i-(j+1)] = val
print(row[:i+1])
n = 6
row = [1] * n # 一次性开辟足够的空间
print(row)
print('-' * 30 )
for i in range(n):
old = 1 # 相当于每行行首1,因为i从4开始就有覆盖了,引入这个变量
for j in range(i//2): # i为0,1不进入
# val = old + row[j+1]
# old = row[j+1]
# row[j+1] = val
row[j+1], old = old + row[j+1], row[j+1]
if i != 2 * (j+1):
row[i-(j+1)] = row[j+1]
print(row[:i+1])
解法1 杨辉三角的基本实现下一行依赖上一行所有元素,是上一行所有元素的两两相加的和,再在两头各加1,预先构建前两行,从而推导出后面的所有行triangle = [[1], [1, 1]]for i in range(2, 6): cur = [1] #current当前 pre = triangle[i-1] #previous 先前的 for j in ra...