我在hackerrank比赛中尝试了一个有趣的问题,并且出现了这个问题。 我使用了itertools,这是代码:
<div class="block">
</div>
<div class="block">
</div>
<div class="block">
</div>
<div class="block">
</div>
<div class="block">
</div>
他们还有其他任何有效的方法吗?因为我在一些我无法访问的测试用例中得到时间错误(因为它是一个小小的竞赛)。
答案 0 :(得分:13)
迭代列表并找到以下内容:
最大正数(a)
第二大正数(b)
最大负数(c)
第二大负数(d)
现在,您可以计算乘法时的最大值,a*b
或c*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