列表求杨辉三角

利用列表可变,有序,可追加的特性来求杨辉三角。

(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])

这里写图片描述

相较前面的方法,计算量减半了,空间复杂度也减少了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值