人。我实现了执行以下操作的功能(我的作业): 假设L是包含至少2个元素的整数列表。 找到L中最长的数字,其中最长的数字可以 要么单调递增,要么单调递减。 如果运行时间最长,请选择最长运行 首先发生。 不修改列表。 返回最长运行的总和
def run_for_el(L, n, operand):
entry = [L[n]]
count = n
while eval ("L[count]" + operand + "L[count+1]"):
entry.append(L[count+1])
if count < len(L)-2:
count += 1
else: break
return entry
def longest_run2(L):
if len(L) == 2:
return sum(L)
storage = []
for n in range(len(L) - 2):
if L[n] <= L[n+1]:
operand = "<="
storage.append(run_for_el(L, n, operand))
if L[n] >= L[n+1]:
operand = ">="
storage.append(run_for_el(L, n, operand))
maximum = storage [0]
for entry in storage:
if len (entry) > len (maximum):
maximum = entry
return (sum (maximum))
这是一个正确的决定,并通过了所有测试用例。关键是我不确定它是最有效的方法。大师的谁可以建议一个更好的?我想优化它。谢谢!
答案 0 :(得分:1)
我没有看到在性能方面重用功能的优势。我只是这样写的。
def longest_run(l):
# increasing
max_len_inc = cur_len = 1
cur_sum = l[0]
for n in range(1, len(l)):
if l[n] >= l[n-1]:
cur_sum += l[n]
cur_len += 1
else:
if cur_len > max_len_inc:
max_len_inc = cur_len
max_sum_inc = cur_sum
min_idx_inc = n
cur_len = 1
cur_sum = l[n]
if cur_len > max_len_inc:
max_len_inc = cur_len
max_sum_inc = cur_sum
min_idx_inc = n
# decreasing
max_len_dec = cur_len = 1
cur_sum = l[0]
for n in range(1, len(l)):
if l[n] <= l[n-1]:
cur_sum += l[n]
cur_len += 1
else:
if cur_len > max_len_dec:
max_len_dec = cur_len
max_len_dec = cur_sum
min_idx_dec = n
cur_len = 1
cur_sum = l[n]
if cur_len > max_len_dec:
max_len_dec = cur_len
max_sum_dec = cur_sum
min_idx_dec = n
if max_len_inc > max_len_dec:
return(max_sum_inc)
elif max_len_inc < max_len_dec:
return(max_sum_dec)
else:
if min_idx_inc < min_idx_dec:
return (max_sum_inc)
else:
return (max_sum_dec)
正如您所看到的,只有l[n] >= l[n-1]
部分不同,所以它看起来冗长冗余,我知道。但速度呢?
l = [9, 1,2,3, 1,1,2,2,3,3,4,4, 9, 8,7,6,5,4, 1,2,34,4,5,6,7,8,9,10,11,12,14,14,16,19]
import time
start_time = time.time()
for i in range(500):
a = longest_run(l)
print(time.time() - start_time) # 0.011501550674438477
start_time = time.time()
for i in range(500):
a = longest_run2(l)
print(time.time() - start_time) # 2.1403748989105225
简单的解决方案速度提高了200倍。希望这会有所帮助。