利用列表可变,有序,可追加的特性来求杨辉三角。
(1):列表嵌套列表
n = 6
triangle = [[1], [1, 1]]
for i in range(2, n):
pre = triangle[i-1]
cur = [1] * (i+1)
for j in range(i-1):
cur[j+1] = pre[j] + pre[j+1]
triangle.append(cur)
print(triangle)
此种方法是在内存中开辟3个列表,triangle、pre前一行列表、cur现在的列表,当i=2时,cur[1] = pre[0] + pre[1]。缺点是会频繁生成pre、cur列表,产生大量垃圾。
(2):在列表后面补0
new = [1]
n = 6
print(new)
for i in range(1, n):
old = new.copy()
old.append(0)
new.clear()
for j in range(i+1):
new.append(old[j-1] + old[j]
print(new)
相较于第一种方法,计算量增加了,频繁地生成新旧两行,会产生大量的垃圾。
(3):利用对称性
n = 6
triangle = []
for i in range(n):
cur = [1] * (i+1)
triangle.append(cur)
for j in range(1, i//2+1):
pre = triangle[i-1]
val = pre[j-1] + pre[j]
cur[j] = val
if i != 2 * j:
cur[-j-1] = val
print(triangle)
相较于前两种方法,计算量减半了,空间复杂度还是一样的。
(4):利用单行列表和对称性
n = 6
cur = [1] * n
for i in range(n):
offset = n - i
m = 1
for j in range(1, i//2+1):
val = m + cur[j]
m = cur[j]
cur[j] = val
if i != 2 * j:
cur[-j-offset] = val
print(cur[:i+1])
相较前面的方法,计算量减半了,空间复杂度也减少了。