查找具有最大总和的2个连续数组块。归还他们的金额

时间:2013-01-25 02:09:51

标签: algorithm max arrays

块不能重叠。他们也不能相邻。假设A的长度> 2。

我知道这与找到max子阵列的总和非常相似,可以在线性时间内完成。

我也很确定该算法与查找max子阵列问题的启动方式相同。

这是我几天前听到的一个问题,我想看看如何解决它。

2 个答案:

答案 0 :(得分:2)

你可以做两次max-subarray算法。

算法

  1. 我们定义一个函数L [i],它意味着a [i]之前的max-subarray之和。它可以从左到右执行max-subarray算法 O(n)复杂性。
  2. 我们定义函数R [i],这意味着在[i]之后的最大子阵列的总和。它可以从右到左执行max-subarray算法     O(n)复杂性。
  3. 从1扫描到n,答案将是最大的L [i] + R [i + 1]。 这一步将是O(n)复杂性。
  4. 简单证明:任何解决方案都会从一个元素中划分出来 数组,所以我们可以在之前和之前计算max-subarray的总和 在每个地方之后。
  5. 代码

    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个步骤:

  1. 使用O(n)查找整个数组的最大和的块。假设块从[i]开始并以[j]结束,总和为S1

  2. 使用O(n)查找前一个块的最小和的块。假设总和是S2

  3. 最终答案是S1-S2

    应该考虑一些边界情况:

    如果数组是1,2,3,2,1。步骤1将整个数组作为块返回。步骤2将返回1.但这违反了2个块不应相邻的请求。所以对于第2步,你应该应用算法从[i + 1]开始并以[j-1]

    结束