繁体   English   中英

查找子数组的第一个和最后一个值相等的最大连续子数组和

[英]Find maximum contiguous subarray sum whose subarray's first & last values are equal

我被问到这个问题,只能想出蛮力的方法

Example - [1 9 -2 9 4 2 4]
Ans - [9 -2 9] = 16

Example - [9 -18 9 2 9]
Ans - 9+2+9 = 20

Example - [5,1,4,1,10,1,7]
Ans - 1+4+1+10+1 = 17

我们可以使用 Kadane 的算法,但我们需要添加子数组和而不是单个值。 我们可以记录每个值的最佳起始索引。 Python代码:

def f(A):
  # Prefix sums
  ps = [0] * (len(A) + 1)
  for i in range(len(A)):
    ps[i] = A[i] + ps[i-1]

  # Map of value to its
  # best starting index.
  h = {}

  # Best overall sum
  best_sum = 0

  for i in range(len(A)):
    # We extend the interval by keeping the same
    # starting index; Otherwise, reset the starting
    # index.
    if (not A[i] in h) or (ps[i] - ps[h[A[i]] - 1] <= 0):
      h[A[i]] = i
    candidate = ps[i] - ps[h[A[i]] - 1] if i != h[A[i]] else 0
    best_sum = max(best_sum, candidate)
  
  return best_sum

As = [
  [1, 9, -2, 9, 4, 2, 4], # 16
  [9, -18, 9, 2, 9], # 20
  [5, 1, 4, 1, 10, 1, 7], # 17
  [1, 2, 3] # 0
]

for A in As:
  print(A)
  print(f(A))
  print('')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM