最大和跳过两个连续整数

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) 那样配对。

以上是关于最大和跳过两个连续整数的主要内容,如果未能解决你的问题,请参考以下文章

phpmailer 列循环和跳过 NULL

给定一个整数序列,求出子段序列的最大和,也就是一段连续和元素的和,使其和最大,(如果

环上最大连续和

若k个连续正整数之和为525,则k的最大值为多少

最大连续子序列问题(tyvj1305)

最大子阵列/连续数组的最大和