Я пытаюсь решить проблему Hackerrank Project Euler # 14 (самая длинная последовательность Коллатца) с использованием Python 3. Ниже приведена моя реализация.
cache_limit = 5000001
lookup = [0] * cache_limit
lookup[1] = 1
def collatz(num):
if num == 1:
return 1
elif num % 2 == 0:
return num >> 1
else:
return (3 * num) + 1
def compute(start):
global cache_limit
global lookup
cur = start
count = 1
while cur > 1:
count += 1
if cur < cache_limit:
retrieved_count = lookup[cur]
if retrieved_count > 0:
count = count + retrieved_count - 2
break
else:
cur = collatz(cur)
else:
cur = collatz(cur)
if start < cache_limit:
lookup[start] = count
return count
def main(tc):
test_cases = [int(input()) for _ in range(tc)]
bound = max(test_cases)
results = [0] * (bound + 1)
start = 1
maxCount = 1
for i in range(1, bound + 1):
count = compute(i)
if count >= maxCount:
maxCount = count
start = i
results[i] = start
for tc in test_cases:
print(results[tc])
if __name__ == "__main__":
tc = int(input())
main(tc)
Есть 12 тестовых случаев,Вышеприведенная реализация проходит до контрольного примера № 8, но не проходит для контрольных примеров № 9 - № 12 по следующей причине:
Terminated due to timeout
Я застрял с этим на некоторое время.Не уверен, что еще можно сделать здесь.
Что еще можно оптимизировать здесь, чтобы я перестал получать тайм-аут?
Любая помощь будет оценена по достоинству:)
Примечание: Используя вышеописанную реализацию, я могу решить актуальную задачу Project Euler # 14.Это дает тайм-аут только для этих 4 тестовых случаев в хакерранке.