负数第二大

时间:2017-11-18 04:29:50

标签: python

我使用它来找到数组中的第二大,它在正数的情况下工作正常但在负数的情况下它会失败。 你能否提出这个解决方案,以便它也适用于负数?

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

2 个答案:

答案 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)