【问题标题】:Can't implement Maximal subarray with length constraint algorithm无法使用长度约束算法实现最大子数组
【发布时间】:2021-12-21 11:08:20
【问题描述】:

我无法让this 算法工作。部分和数组 B[] 是什么?它是否比 A[] 少 1 个元素?对于A = [8, -1, -1, 4, -2, -3, 5, 6, -3],它看起来像B = [7, 6, 10, 8, 5, 10, 16, 13]

尝试了以下 Python 代码:

def maxSubseq(a, k):
    maxSum = -999999999999

    b = [a[0] + a[1]]
    for x in range(1, len(a) - 1):
      b.append(b[x - 1] + a[x + 1])

    from collections import deque
    deq = deque()
    for q in range(len(b)):
        if deq and q - deq[0] > k:
            deq.popleft()
        while deq and b[deq[-1]] > b[q]:
            deq.pop()
        deq.append(q)

        if b[q] - b[deq[0]] > maxSum:
            maxSum = b[q] - b[deq[0]]
    return maxSum

print(maxSubseq([8, -1, -1, 4, -2, -3, 5, 6, -3], 8))

11 - 但应该是 16

【问题讨论】:

  • B[] 应该是 [8, 7, 6, 10, 8, 5, 10, 16, 13] 并且大小与 A[] 相同。
  • @aropan 昨天也试过了,结果还是print(maxSubseq([8, -1, -1, 4, -2, -3, 5, 6, -3], 8)) == 11
  • 使用您的代码,您会错过仅包含第一个元素的子数组。您错过了A[] 中的子数组[8],因为您以b = [a[0] + a[1]] 而不是b=[a[0]] 开头。这就是为什么 A[]B[] 的长度不同的原因。

标签: python arrays algorithm


【解决方案1】:

B 应该是 [0,8, 7, 6, 10, 8, 5, 10, 16, 13]

def maxSubseq(a, k):
    maxSum = -999999999999

    b = [0, a[0]]
    for x in range(1, len(a)):
      b.append(b[x] + a[x])
    from collections import deque
    deq = deque()
    for q in range(len(b)):
        if deq and q - deq[0] > k:
            deq.popleft()
        while deq and b[deq[-1]] > b[q]:
            deq.pop()
        deq.append(q)

        if b[q] - b[deq[0]] > maxSum:
            maxSum = b[q] - b[deq[0]]
    return maxSum
print(maxSubseq([8, -1, -1, 4, -2, -3, 5, 6, -3], 8))

【讨论】:

    猜你喜欢
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多