如何对列表中的两个最大元素求和?

How to sum the two largests elements in a list?

我有一个这样的列表:

[1, 2, 5, 2, 7, 3, 9, 5...]

有没有一种有效的方法来计算这里最大的 2 个元素的总和,而不是:

for i in range():
    for j in range():

我发现了这个: "Maximum subarray problem"

但我还没有完全理解它的作用。

sum(sorted([9,8,1,3,4,5,7,0])[-2:])
  1. 对所有元素进行排序
  2. 得到最后两个元素
  3. 求和

这是一个线性时间的解决方案:

#initialize these to huge negative numbers
largest = -1e10
second_largest = -1e11
l = [9,8,1,3,4,5,7,0]
for item in l:
    if item > largest:
        second_largest = largest
        largest = item
    elif item > second_largest:
        second_largest = item

print(largest+second_largest)
# 17

这里是线性解:

x = [1, 2, 5, 2, 7, 3, 9, 5]
max1 = -1;
max2 = -1;
for i in range(len(x)):
    if x[i] > max1:
        max2 = max1
        max1 = x[i]
    elif x[i] > max2:
        max2 = x[i]

print(max1+max2)

如果您的数组只包含正整数,否则请考虑将 max1、max2 更改为尽可能低的值

如果您不介意使用库,可以使用 heapqnlargest:

import heapq
x = [1, 2, 5, 2, 7, 3, 9, 5]

然后

sum(heapq.nlargest(2, x))

将return

16

另外 pandas 是一个选项(但只有在您导入它时才使用它,因为它是一个相当重的依赖项):

import pandas as pd
pd.Series(x).nlargest(2).sum()

还有returns 16

如果您有 重复的最大值 ,您可以使用 sets:

x = [1, 2, 5, 2, 7, 3, 9, 5, 9]

然后

sum(heapq.nlargest(2, x))

将return

18

作为9 + 9 = 18

sum(heapq.nlargest(2, set(x)))

将return

16

然后计算 9 + 7 = 16

另一个 O(n) 解决方案,但更像 pythonic,放弃了一些性能(在列表上迭代 4 次)

l = [1, 2, 5, 2, 7, 3, 9, 5]

# find largest
largest = max(l)
# remove from list
l.remove(largest)
# second largest
largest2 = max(l)
# remove from list
l.remove(largest2)
print(largest+largest2)
>> 16

为了使它更紧凑,将完全相同的过程放在一行中:

l = [1, 2, 5, 2, 7, 3, 9, 5]
l.pop(l.index(max(l))) + l.pop(l.index(max(l)))
print(largest+largest2)
>> 16

具有唯一编号

这是最简单的方法

a = [1, 2, 5, 2, 7, 3, 9, 5]
m1 = max(a)
a.pop(a.index(m1))
m2 = max(a)
print(m1 + m2)

输出:16

如果你有更多相同的数字,但你想摆脱它们 - 这样你就可以添加两个最大的不同数字 - 你可以这样做:

a = [1, 2, 5, 2, 7, 3, 9, 5]
a = set(a)
m1 = max(a)
a = list(a)
a.pop(a.index(m1))
m2 = max(a)
print(m1 + m2)

输出:16

如果您想要添加列表中的最大数字,即使它们相同(即 9 和 9),也可以使用第一个代码示例,它将适用于您。