思路:求最大子数组,那么按平常思路就是在一个数组中遍历。利用cur当前值与0的关系,若大于则继续,反之重新记录cur = arr[i]
然而本题的关键在于数组串联,那么我们就不应该局限与原始数组arr。
若k=2,其中最大子数组可能跨越与两数组之间:
k > 2,那么此时需要思考其中跨越的子数组是否可以推广到第k个arr
红线代表两个数组间的子数组,为正,绿线即负数组。
若依次合并后更大,则更新
max(max_num,sum(arr)*(k) - sum(arr[:ans[0]]) - sum(arr[ans[1]-lt+1:]))
若k=1,按照常思路即可
lt = len(arr)
mod = 1000000000 + 7
if k >= 2:
p = arr + arr
lt1 = 2 * lt
cur = 0
ans = [0,0]
max_num = 0
pos = 0
for i in range(lt1):
if cur < 0:
cur = p[i]
pos = i
else:
cur += p[i]
if max_num <= cur:
ans = [pos,i]
max_num = cur
return max(max_num,sum(arr)*(k) - sum(arr[:ans[0]]) - sum(arr[ans[1]-lt+1:])) % mod
else:
cur = 0
max_num = 0
for i in range(lt):
if cur < 0:
cur = arr[i]
else:
cur += arr[i]
if max_num <= cur:
max_num = cur
return max_num % mod