如何在列表中找到两个元素的最大乘积?

时间:2016-09-05 11:40:39

标签: python python-2.7 python-3.x itertools

我在hackerrank比赛中尝试了一个有趣的问题,并且出现了这个问题。 我使用了itertools,这是代码:

              <div class="block">

              </div>

              <div class="block">

              </div>
              <div class="block">

              </div>
              <div class="block">

              </div>
              <div class="block">

              </div>

他们还有其他任何有效的方法吗?因为我在一些我无法访问的测试用例中得到时间错误(因为它是一个小小的竞赛)。

3 个答案:

答案 0 :(得分:13)

迭代列表并找到以下内容:

最大正数(a)

第二大正数(b)

最大负数(c)

第二大负数(d)

现在,您可以计算乘法时的最大值,a*bc*d

答案 1 :(得分:3)

只需对列表进行排序,然后选择列表中最后2项的最大产品和列表中的前2项:

from operator import mul

numbers = [10, 20, 1, -11, 100, -12]
l = sorted(numbers)    # or sort in place with numbers.sort() if you don't mind mutating the list
max_product = max(mul(*l[:2]), mul(*l[-2:]))

由于排序,这是一个O(n log n)解决方案。其他人建议使用heapq解决方案,我发现对于长度超过几千个随机整数的列表来说更快。

答案 2 :(得分:2)

这是@ User_Targaryen逻辑之后的实现。 heapq会返回列表中最大的2个和2个最小的数字,mul operator会返回这两对数字的乘积,max会返回这两个数字中最大的一个。

>>> import heapq
>>> from operator import mul
>>> l = [2,40,600,3,-89,-899]
>>> max(mul(*heapq.nsmallest(2,l)),mul(*heapq.nlargest(2,l)))
80011
# -899*-89 = 80011