我有一个这样的清单:
[1, 2, 5, 2, 7, 3, 9, 5...]
在没有:
的情况下,是否有一种有效的方法可以找到2个最大元素的总和for i in range():
for j in range():
我发现了这个: "最大子阵列问题"
但我还不完全明白它的作用。
答案 0 :(得分:9)
sum(sorted([9,8,1,3,4,5,7,0])[-2:])
答案 1 :(得分:6)
这是线性时间解决方案:
#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
答案 2 :(得分:3)
这是线性解决方案:
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更改为最低可能值
答案 3 :(得分:3)
另一个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
答案 4 :(得分:2)
如果您不介意使用图书馆,可以使用heapq
' nlargest
:
import heapq
x = [1, 2, 5, 2, 7, 3, 9, 5]
然后
sum(heapq.nlargest(2, x))
将返回
16
同样pandas是一个选项(但只有当你导入它时才使用它,因为它是一个相当重的依赖):
import pandas as pd
pd.Series(x).nlargest(2).sum()
也会返回16
如果您有重复的最大值,则可以使用sets
:
x = [1, 2, 5, 2, 7, 3, 9, 5, 9]
然后
sum(heapq.nlargest(2, x))
将返回
18
为9 + 9 = 18
和
sum(heapq.nlargest(2, set(x)))
将返回
16
然后计算9 + 7 = 16
。
答案 5 :(得分:1)
这是最简单的方式
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),请使用第一个代码示例,它将适合您。