Если я правильно понимаю ваше max_pairwise_product_fast
, вы пытаетесь найти наибольшее и второе по величине число и умножить их.Проблема в том, что вы инициализируете index1
как 1
, а index2
с 1
или 2
, но индексы массива начинаются с 0
.Таким образом, ваш код потерпит неудачу для списка только с двумя элементами, например [1,2]
.Измените начальные индексы на 0
, и соответственно измените range
в циклах, и это будет работать.
Вы также можете удалить некоторые проверки, например, if/else
, так как это избыточно с помощьючек у вас во втором цикле.Кроме того, сравнивая number[index1]
и number[index2]
, вы можете пропустить наивысший продукт, если дважды появится наибольшее число, например, [1,2,2]
.
Оставаясь близко к исходному коду, вы можете попробовать это:
def max_pairwise_product_fast(numbers):
n = len(numbers)
index1 = 0
for i in range(n):
if numbers[i] > numbers[index1]:
index1 = i
index2 = 0
for i in range(n):
if index2 != index1 and numbers[i] > numbers[index2]:
index2 = i
return numbers[index1] * numbers[index2]
Но вы также можете использовать max
вместо этих двух циклов:
def max_pairwise_product_fast(numbers):
n = len(numbers)
index1 = max(range(n), key=lambda i: numbers[i])
index2 = max((i for i in range(n) if i != index1), key=lambda i: numbers[i])
return numbers[index1] * numbers[index2]
Или отсортировать весь массив и выбрать два старших:
def max_pairwise_product_fast(numbers):
second, first = sorted(numbers)[-2:]
return first * second
Примечаниеоднако, это может все еще потерпеть неудачу, если список содержит отрицательные числа, например [1, 2, -3, -4]
.Для этого вы могли бы снова вызвать ту же функцию со всеми номерами в списке с отрицанием и выбрать самый высокий из двух результатов.