杨辉三角的四种实现方法

解法1 杨辉三角的基本实现

下一行依赖上一行所有元素,是上一行所有元素的两两相加的和,再在两头各加1,预先构建前两行,从而推导出后面的所有行

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)

解法3 对称性

思路: 能不能一次性开辟空间,可以使用列表解析式或者循环迭代的方式。 能不能减少一半的数字计算。左右对称。

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值