def second_smallest(numbers):
m1, m2 = float('inf'), float('inf')
for x in numbers:
if x <= m1:
m1, m2 = x, m1
elif x < m2:
m2 = x
return m2
旧版本依赖于Python 2实施细节,该细节None
始终排在其他任何东西之前(因此测试为“较小”);我取代了使用float('inf')
作为前哨,为无穷大总是测试,@H_502_11@更大的 比任何其它号码。理想情况下,应该使用原始函数float('-inf')
代替原始函数None
,以免与其他Python实现可能不共享的实现细节相关联。
演示:
>>> def second_smallest(numbers):
... m1, m2 = float('inf'), float('inf')
... for x in numbers:
... if x <= m1:
... m1, m2 = x, m1
... elif x < m2:
... m2 = x
... return m2
...
>>> print second_smallest([1, 2, 3, 4])
2
在您发现的函数之外,使用该heapq.nsmallest()
函数从迭代器返回两个最小值,并从这两个中选择第二个(或最后一个)值几乎一样有效:
from heapq import nsmallest
def second_smallest(numbers):
return nsmallest(2, numbers)[-1]
像上面的实现一样,这是一个O(N)解决方案。保持堆变量的每一步都需要logK时间,但是K在这里是一个常数(2)!无论您做什么, @H_502_11@都不要使用sort ;这需要O(NlogN)时间。