如何将列表中的两个大元素相加?

时间:2018-02-07 14:38:53

标签: python algorithm list sub-array

我有一个这样的清单:

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

在没有:

的情况下,是否有一种有效的方法可以找到2个最大元素的总和
for i in range():
    for j in range():

我发现了这个: "最大子阵列问题"

但我还不完全明白它的作用。

6 个答案:

答案 0 :(得分:9)

sum(sorted([9,8,1,3,4,5,7,0])[-2:])
  1. 对所有元素进行了排序
  2. 获取最后两个元素
  3. 总结

答案 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),请使用第一个代码示例,它将适合您。