Python 负数第二大
我用它来寻找数组中的第二大值,它在正数的情况下运行良好,但在负数的情况下失败。 你能推荐这个解决方案,这样它也适用于负数吗Python 负数第二大,python,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 下面是一个On解决方案,它查找并返回数字数组
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
下面是一个On解决方案,它查找并返回数字数组中的第二大元素:
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个元素,否则排序和检索第二个元素可能会更快。针对此类问题的定制工具是标准库中的heapq模块:
import heapq
scnd = heapq.nlargest(2, yourarray)[1]
这是打开的,比排序快得多,尽管你只会开始感觉到百万条左右的差异
注意:如果您想要第二个最大值,那么如果您的元素是可散列的,那么一个快速修复程序将转换为一个集合:
scnd = heapq.nlargest(2, set(yourarray))[1]
如果这不是一个选项:
frst = max(yourarray)
scnd = max(i for i in yourarray if i<first)
为什么不对数组进行排序,然后选择第二个或最后第二个条目?@tadman你是在建议一个On问题的On*logn解决方案。我不认为这里的问题是负数。如果你将它们全部向上移动以消除负面影响,我相信你会看到一个相同的结果。对于这个示例数据,它正在打印-3,这是第二大值,而不是第二大列表元素。@Tomkarze在普通长度数组上,运行时间实际上是相同的。除非您有可测量的性能问题,否则简单的工作解决方案通常是最好的。过早优化会以不必要的复杂性扼杀代码库。@tadman您假设样本数据的大小表明了典型问题的大小。你是基于什么假设的?事实上,倒数第二个元素是不同的。它需要向后扫描第二个不同的值。例如,如果排序列表以…,8,12,12]结尾,则所需的值是8,而不是12。是的,我同意。我看到了你早些时候的评论。OP没有具体说明,是吗?最终OP在评论中做了。您的解决方案符合OP的澄清意图,但完整的排序解决方案需要扫描第二个不同的值。