1. 程式人生 > >Lintcode: 42. 最大子陣列 II

Lintcode: 42. 最大子陣列 II

描述

給定一個整數陣列,找出兩個 不重疊 子陣列使得它們的和最大。
每個子陣列的數字在陣列中的位置應該是連續的。
返回最大的和。

樣例

給出陣列 [1, 3, -1, 2, -1, 2]
這兩個子陣列分別為 [1, 3] 和 [2, -1, 2] 或者 [1, 3, -1, 2] 和 [2],它們的最大和都是 7

挑戰

要求時間複雜度為 O(n)

dalao思路:left陣列表示0-i這個區間內和最大的子陣列,right陣列表示i-nums.size()-1這個區間內和最大的子陣列

  public int maxTwoSubArrays(List<Integer> nums) {
        if(nums == null || nums.size() == 0) {
            return 0;
        }

        int maxSum = nums.get(0),curSum = 0;
        int []left = new int[nums.size()];
        int []right = new int[nums.size()];
        for (int i = 0;i < nums.size();i++) {
            curSum += nums.get(i);
            maxSum = Math.max(maxSum,curSum);
            curSum = Math.max(curSum,0);
            left[i] = maxSum;
        }
        curSum = 0;
        maxSum = nums.get(nums.size()-1);
        for (int i = nums.size()-1;i > 0;i--) {
            curSum += nums.get(i);
            maxSum = Math.max(maxSum,curSum);
            curSum = Math.max(curSum,0);
            right[i] = maxSum;
        }
        maxSum = Integer.MIN_VALUE;
        for (int i = 0;i < nums.size()-1;i++) {
            maxSum = Math.max(maxSum,left[i] + right[i+1]);
        }
        return maxSum;
    }
//前後遍歷、列舉法

summary: 1、前後遍歷的思想/interval 型別題也可以參考,因為兩個子陣列不能重合,先正向遍歷得到0-i位置內最大子陣列,maxSum = Math.max(maxSum,curSum);保證了left[i]會是這區間的最大值。也有一點動態規劃dp的思路

2、因為interval不能重合,所以正反遍歷,並且有一個變量表示符合一個區間符合條件的值