三个课程的最大乘积:https://app.codility.com/programmers/lessons/6-sorting/max_product_of_three/
为了解决这一课,我编写了这个函数,如下所示;
import itertools
def solution(A):
combs=[]
for pivot_element in A:
to_comb=A[A.index(pivot_element):]
for comb in itertools.combinations(to_comb, 3):
mul_comb= comb[0] * comb[1] * comb[2]
combs.append(mul_comb)
return max(combs)
我的结果是,
result_of_algorithm={
"correctness":100,
"performance":0,
"overall":44,
"time complexity": "O(N^3)"
}
我怎样才能把它的性能提高到O(n)时间复杂度?
5条答案
按热度按时间nbewdwxp1#
O(n)版本的schwobaseggl解,也得到了100%:
具有最大允许事例的基准(-1000到1000之间的100,000个值):
基准测试代码(在线试用!):
dgjrabp22#
简单地说,你可以在对数线性时间内完成:
排序允许你只尝试排序顺序两端的数字。这两个选项说明了包括负数的可能性。它在正确性和性能上都达到了100%。
oyt4ldly3#
从这个来源我得到了一个非常简单的解决方案:https://youtu.be/qr3i9cXAjbc
这个算法和@schwobaseggl的答案中的算法是一样的,就像下面一样。在性能和正确性上都是100分。
92dk7w1h4#
该想法描述如下:https://afteracademy.com/blog/maximum-product-of-three-numbers
只有两个可能的选项:
1.你需要三个最大的数字(如果所有的数字都是正数,情况显然如此)
1.你需要最大的数和两个最小的数,只有当两个最小的数为负数,并且它们的乘积大于第二大数和第三大数的乘积时,才能得到最大的数和两个最小数的乘积,显然,两个最小数的乘积是正数,你需要把它乘以最大数。
你需要检查这两种情况,然后返回更大的值,我把链接中的代码改编成Python,它的时间复杂度为
O(n)
,因为我们只迭代列表中的一个:例如,
print(solution([-11, -10, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
会给出990
(-11 * -10 * 9
)pzfprimi5#