牛客--杨辉三角的变形

第一行只有一个数1,以下每行的每个数,是恰好是它上面的数、左上角数和右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。

求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3,输入2则输出-1。

import sys
#求到n行的杨辉三角
#n = 2 i =0,1 j = 1     2
#n =3 i =0,1,2 j = 1,2,3  4
# n = 4 i =0,1,2,3 j = 1,2,3,4,5 6
###超时,时间复杂度n*n
def yang_trigngle(n):
    tri_list = []
    for i in range(n):
        row = [1]
        if i > 0:
            for j in range(1, len(tri_list) + 1):              
                left = tri_list[j-2] if j-2 >= 0 else 0
                right = tri_list[j] if j <= len(tri_list)-1 else 0
                row.append(left + tri_list[j-1] + right)
            row.append(1)
        tri_list = row
    return tri_list
    
for line in sys.stdin:
    a = line.split()
    b = int(a[0])
    tri_list = yang_trigngle(b)
    for tri in tri_list:
        if tri % 2 == 0:
            print(tri_list.index(tri)+1)
            break
    else:
        print(-1)

优化,降低时间复杂度

使用递归---递归深度超出最大限制的错误

def yang_trigngle(n):
    if n == 1:
        tri_list = [1]
        return tri_list
    elif n == 2:
        tri_list = [1,1,1]
        return tri_list
    else:
        tri_list = yang_trigngle(n-1)
        row = [1]
        row.append(tri_list[0] + tri_list[1])
        for i in range(n-2):  #n = 2                     
            row.append(tri_list[i] + tri_list[i+1] + tri_list[i+2])
        row.extend(row[::-1][1:])
        tri_list = row
        return tri_list

for line in sys.stdin:
    a = line.split()
    b = int(a[0])
    tri_list = yang_trigngle(b)
    for tri in tri_list:
        if tri % 2 == 0:
            print(tri_list.index(tri)+1)
            break
    else:
        print(-1)

RecursionError: maximum recursion depth exceeded in comparison

总结规律:杨辉三角的偶数位置只有2,3,4,除了1,2特殊,为-1

因此,需优化调用函数的代码

def yang_trigngle(n):
    if n == 1:
        tri_list = [1]
        return tri_list
    elif n == 2:
        tri_list = [1,1,1]
        return tri_list
    else:
        tri_list = yang_trigngle(n-1)
        row = [1]
        row.append(tri_list[0] + tri_list[1])
        for i in range(n-2):  #n = 2                     
            row.append(tri_list[i] + tri_list[i+1] + tri_list[i+2])
        row.extend(row[::-1][1:])
        tri_list = row
        return tri_list
       
for line in sys.stdin:
    a = line.split()
    b = int(a[0])
    if b == 1 or b == 2:
        tri_list = yang_trigngle(b)
    elif b % 2 != 0:
        tri_list = yang_trigngle(3)
    elif b % 4 == 0:
        tri_list = yang_trigngle(4)
    else:
        tri_list = yang_trigngle(6)
    for i in range(len(tri_list)):
        if tri_list[i] % 2 == 0:
            print(i+1)
            break
    else:
        print(-1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值