我使用它来找到数组中的第二大,它在正数的情况下工作正常但在负数的情况下它会失败。 你能否提出这个解决方案,以便它也适用于负数?
arr = [-3,3,-3,3];
k = max(arr)
m= arr[0];
i=0;
k = max(arr)
while i <(len(arr)-1):
if(m<arr[i+1] and arr[i+1] !=k ):
m= arr[i+1]
i+=1
print m
答案 0 :(得分:2)
这是一个O(n)
解决方案,可以找到并返回数字数组中的第二大元素:
def second_largest(seq):
largest = float("-inf")
second_largest = float("-inf")
for elt in seq:
if elt > largest:
second_largest = largest
largest = elt
elif elt > second_largest:
second_largest = elt
return second_largest
arr = [-3,3,-3,3]
print(second_largest(arr))
arr = [-3, -4, -5, -1]
print(second_largest(arr))
除非您的序列非常大(1000个元素),否则对它进行排序并检索第二个元素可能会更快。
答案 1 :(得分:1)
针对此类问题的定制工具是标准库中的heapq
模块:
import heapq
scnd = heapq.nlargest(2, yourarray)[1]
这是O(n),比排序快得多,尽管你只会开始感觉到百万条左右的差异。
注意:如果你想要第二大的按值,如果你的元素是可以清洗的,那么一个快速修复就会转换成一个集合:
scnd = heapq.nlargest(2, set(yourarray))[1]
如果那不是一个选项:
frst = max(yourarray)
scnd = max(i for i in yourarray if i<first)