Помогите оптимизировать рабочий код. Python
Нужно найти максимальное произведение двух чисел в списке. Числа могут быть и отрицательные. Код рабочий, но тестирующая программа выдаёт Time Limit Exceeded. Как можно его оптимизировать? Интересно можно ли преобразовать имеющихся 2 for в list comprehension, ибо у меня за 3 часа это сделать так и не получилось.
def composition():
s = [int(i) for i in input().split()]
lists = []
total = 0
for i in range(len(s)):
for j in range(len(s)):
if s[i] * s[j] > total and i != j:
total = s[i] * s[j]
lists.append(s[i])
lists.append(s[j])
a = lists[-1]
b = lists[-2]
if a < b:
return a, b
return b, a
print(*composition())
Ответы (3 шт):
ну если решать совсем в лоб, вот просто в лобешник, то
data = [*map(int, input().split())]
# оцениваем только положительные числа
max1pos = max(data[0], data[1])
max2pos = min(data[0], data[1])
for value in data:
if value <= 0:
continue
if value >= max1pos:
max1pos, max2pos = value, max1pos
elif value > max2pos:
max2pos = value
# оцениваем только отрицательные числа числа
max1neg = min(data[0], data[1])
max2neg = max(data[0], data[1])
for value in data:
if value > 0:
continue
if value <= max1neg:
max1neg, max2neg = value, max1neg
elif value < max2neg:
max2neg = value
# выводим результат
print(max1pos, max2pos) if max1pos * max2pos > max1neg * max2neg else print(max1neg, max2neg)
вот так даже получше (покороче):
data = [*map(int, input().split())]
max1pos, max2pos = max(data[0], data[1]), min(data[0], data[1])
max1neg, max2neg = max2pos, max1pos
for value in data:
if value <= 0:
if value <= max1neg:
max1neg, max2neg = value, max1neg
elif value < max2neg:
max2neg = value
else:
if value >= max1pos:
max1pos, max2pos = value, max1pos
elif value > max2pos:
max2pos = value
# выводим результат
print(max1pos, max2pos) if max1pos * max2pos > max1neg * max2neg else print(max1neg, max2neg)
Предположу, что числа в последовательности являются уникальнымы. Для поиска всех возможных комбинаций неповторяющихся отлично подходит itertools.combinations. Для повторяющихся — combinations_with_replacement.
from itertools import combinations
data = map(int, input().split()))
uq_pairs = combinations(data) # только уникальные неповторяющиеся пары
result = max(
uq_pairs,
key=lambda x: x[0] * x[1], # функция-ключ для поиска максимума
)
самый короткий код без использования каких либо библиотек :)
data = sorted([*map(int, input().split())])
print(data[0], data[1]) if data[0] * data[1] > data[-1] * data[-2] else print(data[-1], data[-2])
более короткое решение:
data = sorted([*map(int, input().split())])
print(*max(data[:2], data[-2:], key=lambda obj: obj[0] * obj[1]))