【发布时间】:2018-08-19 19:28:40
【问题描述】:
例如:
输入:A = [ 6 4 3 -5 0 2 -7 1 ]
输出:5
因为 5 是未出现在数组中的最小正整数。
我已经为这个问题写了两个解决方案。第一个很好,但我不想使用任何外部库 + 它的 O(n)*log(n) 复杂性。当输入是混沌序列长度=10005(带减号)时,第二种解决方案“我需要你的帮助来优化它”会出错。
解决方案 1:
from itertools import count, filterfalse
def minpositive(a):
return(next(filterfalse(set(a).__contains__, count(1))))
解决方案 2:
def minpositive(a):
count = 0
b = list(set([i for i in a if i>0]))
if min(b, default = 0) > 1 or min(b, default = 0) == 0 :
min_val = 1
else:
min_val = min([b[i-1]+1 for i, x in enumerate(b) if x - b[i - 1] >1], default=b[-1]+1)
return min_val
注意:这是一个关于 codility 的演示测试,解决方案 1 获得了 100% 和 解决方案 2 得到了 77 %。
“解决方案 2”中的错误是由于:
性能测试-> 中等混沌序列长度 = 10005(带减号)预期为 3 10000
性能测试 -> large chaotic + many -1, 1, 2, 3 (with 减)得到 5 预期 10000
【问题讨论】:
-
我认为您假设
list(set(a))已排序,但事实并非如此。不清楚你在问什么——你是在问工作代码吗? -
两者都在工作,但我正在寻找一种方法来优化该代码以使用 O(n) 时间复杂度“如我的问题所述”。
-
感谢Paul 的提示“我认为您正在假设 list(set(a)) ”。它不会影响我的第二个代码。我以后会用 sorted。
-
这是来自codility.com的演示任务:)
标签: python python-3.x algorithm time-complexity