Найдите самый большой продукт, который можно сформировать, используя 3 элемента в списке в python? - PullRequest
1 голос
/ 26 января 2020

Я попытался решить проблему и написал код. Может кто-нибудь сказать мне, если мой код охватывает все случаи и если есть лучший способ для этого это.

Вот мой код

a = [-12, -4, 6, 3]
a.sort()


if a[0]*a[1] > a[-1]*a[-2]:
    res = a[0]*a[1]*a[-1]
else:
    res = a[-1]*a[-2]*a[-3]

print(res)

Ответы [ 5 ]

1 голос
/ 27 января 2020

Это может быть очень эффективно сделано за время O (nlogn) и пространство O (1). Сначала отсортируйте список. Затем вернуть максимум произведения трех последних элементов списка и произведения первых двух элементов и последнего элемента.

def prod (lis):
  lis.sort()
  return max(lis[0] * lis[1] * lis[-1], lis[-1] * lis[-2] * lis[-3])
1 голос
/ 26 января 2020

Большинство pythoni c, почему стоит использовать itertools.combination (), а затем применить itertools.starmap (), чтобы вы могли обрабатывать списки разной длины или получать произведение с разным количеством элементов.

Просматривайте эти документы :) https://docs.python.org/3.7/library/itertools.html

0 голосов
/ 27 января 2020

Я не уверен на 100%, если это то, что вы ищете, но если вы ищете максимальное произведение из 3 чисел в списке, вы можете сделать что-то вроде этого:

from itertools import combinations
from operator import mul

def find_max_3_product(a):
    return max([reduce(mul,x) for x in combinations(a,3)])

И вы можете даже обобщить это, чтобы работать для любого n:

def find_max_n_product(a, n):
    return max([reduce(mul,x) for x in combinations(a,n)])
0 голосов
/ 26 января 2020

ваш подход предполагает, что если произведение первых 2 элементов из отсортированного списка ниже, чем произведение последних 2 элементов, то вы просто используете произведение последних 3 элементов, но это не всегда так, поскольку произведение из последних 3 элементов может быть 0 или отрицательным (например: [-10, -9, -1, 0, 11, 20] или [-10, -9, -1, 11, 20])

вы можете использовать (при условии, что a отсортировано):

res = max(a[0] * a[1] * a[-1], a[-1] * a[-2] * a[-3])
0 голосов
/ 26 января 2020

Это должно работать всегда (при условии, что входные данные уже отсортированы):

import numpy as np
from itertools import combinations

def max_product_of_three( a ) :
    #a.sort()    # enable if needed
    if len(a) > 6 :
        a = a[:3] + a[-3:]
    products = [(np.prod(i), i) for i in combinations( a, 3 )]
    return max( products )

возвращает:

>>> max_product_of_three( [-12, -4, 13, 5, 0] )
(624, (-12, -4, 13))
>>> 

Существует только 20 возможных комбинаций для массива из 6, поэтому работает в постоянное время с любым размером массива (не считая сортировку, которая займет O (NlogN))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...