最大和跳过两个连续整数
Posted
技术标签:
【中文标题】最大和跳过两个连续整数【英文标题】:max sum skipping two consecutive integers 【发布时间】:2020-03-30 17:27:02 【问题描述】:我需要返回数组 N 的最大总和,跳过两个连续的值。 例如, N = [10, 30, 50, 60, 5, 60]。 输出:175,跳过两个第一个值 [10,30] = 40。
我写了这个:
def maxSum(array):
tempSum = sum(array)
totalSum=0
for i in range(len(array)):
prevSum = tempSum - sum(array[i:i+2])
if prevSum > totalSum:
totalSum = prevSum
有什么办法可以通过 Greedy、DAC 或动态程序来解决这个问题?
【问题讨论】:
您的解决方案是 O(N)(线性),所以我怀疑它是否可以改进;无论如何,求和肯定需要完整的迭代。 这个实现中有一个错误,因为i
的范围高达len(array)-1
,所以你尝试的最后一个“对”实际上只是一个元素。
【参考方案1】:
这种方法是O(n)
和贪婪:
N = [10, 30, 50, 60, 5, 60]
total = sum(N)
result = max(total - sum(pair) for pair in zip(N, N[1:]))
print(result)
输出
175
【讨论】:
zip(*(2 * [iter(N)]))
为您提供无需切片的成对步进的迭代器。
另外,这与 OP 发布的完全相同的解决方案,尽管使用了更简洁的代码。
@MartijnPieters zip(*(y := iter(N), y))
也会这样做吗?
可以,但需要 Python 3.8 或更高版本。 :-)
@RaySteam 不,这将像 (1,2), (3,4), (5,6)
而不是 (1,2), (2,3), (3,4), (4,5), (5,6)
那样配对。以上是关于最大和跳过两个连续整数的主要内容,如果未能解决你的问题,请参考以下文章