Problem

Given an array of integers, find two non-overlapping subarrays which have the largest sum.
The number in each subarray should be contiguous.
Return the largest sum.

The subarray should contain at least one number

Example
For given [1, 3, -1, 2, -1, 2], the two subarrays are [1, 3] and [2, -1, 2] or [1, 3, -1, 2] and [2], they both have the largest sum 7.

思路

  • 与maximum subarray 做法一样,
  • 由于要取两个subarray, 并且没有重合的地方. 所以将数组划分两个区间.
  • [0, i] 和 [i, len - 1]
  • left[i] 代表 0 ~ i 这个区间的最大子数组和, 所以一个for循环从左往右扫
  • right[i] 代表 i ~ len-1 这个区间的最大子数组和, 所以另一个for循环从右往左扫
    public int maxTwoSubArrays(ArrayList<Integer> nums) {
        if (nums == null || nums.size() == 0) {
            return 0;
        }

        int size = nums.size();
        int[] left = new int[size];
        int[] right = new int[size];

        int min = 0;
        int sum = nums.get(0);
        left[0] = nums.get(0);
        for (int i = 1; i < size; i++) {
            min = Math.min(min, sum);
            sum += nums.get(i);
            left[i] = Math.max(left[i - 1], sum - min);
        }

        min = 0;
        sum = nums.get(size - 1);
        right[size - 1] = nums.get(size - 1); 
        for (int i = size - 2; i >= 0; i--) {
            min = Math.min(min, sum);
            sum += nums.get(i);
            right[i] = Math.max(right[i + 1], sum - min);
        }


        int ans = Integer.MIN_VALUE;
        for (int i = 0; i < size - 1; i++) {
            ans = Math.max(ans, left[i] + right[i + 1]);
        }

        return ans;
    }

results matching ""

    No results matching ""