【问题标题】: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,所以你尝试的最后一个“对”实际上只是一个元素。

标签: python algorithm sum dynamic-programming divide-and-conquer


【解决方案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) 那样配对。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
相关资源
最近更新 更多