块不能重叠。他们也不能相邻。假设A的长度> 2。
我知道这与找到max子阵列的总和非常相似,可以在线性时间内完成。
我也很确定该算法与查找max子阵列问题的启动方式相同。
这是我几天前听到的一个问题,我想看看如何解决它。
答案 0 :(得分:2)
你可以做两次max-subarray算法。
def max_two_sub_array():
sum = l[0] = ls[0] = 0
for i = 1 to n:
sum += a[i]
if sum < 0: sum = 0
if l[i - 1] > sum:
l[i] = l[i - 1]
ls[i] = ls[i - 1] # endpoint of l[i]
else
l[i] = sum
ls[i] = i
sum = r[n + 1] = 0
rs[n + 1] = n + 1
for i = n to 1:
sum += a[i]
if r[i + 1] > sum:
r[i] = r[i + 1]
rs[i] = rs[i + 1] # startpoint of r[i]
else
r[i] = sum
rs[i] = i
ans = 0
for i = 0 to n:
ans = max(ans, l[i] + r[i + 1])
return ans
答案 1 :(得分:-1)
2个步骤:
使用O(n)查找整个数组的最大和的块。假设块从[i]开始并以[j]结束,总和为S1
使用O(n)查找前一个块的最小和的块。假设总和是S2
最终答案是S1-S2
应该考虑一些边界情况:
如果数组是1,2,3,2,1。步骤1将整个数组作为块返回。步骤2将返回1.但这违反了2个块不应相邻的请求。所以对于第2步,你应该应用算法从[i + 1]开始并以[j-1]
结束