第一行只有一个数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)