Maximum Subarray Difference

Maximum Subarray Difference

题目地址

https://www.lintcode.com/problem/maximum-subarray-difference/description

题目描述

Given an array with integers.

Find two non-overlapping subarrays A and B, which |SUM(A) - SUM(B)| is the largest.

Return the largest difference.

代码

Approach #1 left_max, left_min, right_max, right_min

public class Solution {
    public int maxDiffSubArrays (int[] nums) {
    int size = nums.length;
    int[] left_max = new int[size];
    int[] left_min = new int[size];
    int[] right_max = new int[size];
    int[] right_min = new int[size];
    int[] copy = new int[size];

    for(int i = 0; i < size; i++) {
      copy[i] = -1 * nums[i];
    }
    // Forward : get max subarray
    int max = Integer.MIN_VALUE;
    int sum = 0;
    int minSum = 0;
    for (int i = 0; i < size; i++) {
      sum += nums[i];
      max = Math.max(max, sum - minSum);
      minSum = Math.min(minSum, sum);
      left_max[i] = max;
    }
    // Backward: get max subbary
    max = Integer.MIN_VALUE;
    sum = 0;
    minSum = 0;
    for (int i = size - 1; i >= 0; i--) {
      sum += nums[i];
      max = Math.max(max, sum - minSum);
      minSum = Math.min(minSum, sum);
      right_max[i] = max;
    }

    // Forward: get min subarray
    max = Integer.MIN_VALUE;
    sum = 0;
    minSum = 0;
    for (int i = 0; i < size; i++) {
      sum += copy[i];
      max = Math.max(max, sum - minSum);
      minSum = Math.min(sum, minSum);
      left_min[i] = -1 * max;
    }
    // Backward: get min subarray
    max = Integer.MIN_VALUE;
    sum = 0;
    minSum = 0;
    for (int i = size - 1; i >= 0; i--) {
      sum += copy[i];
      max = Math.max(max, sum - minSum);
      minSum = Math.min(sum, minSum);
      right_min[i] = -1 * max;
    }

    int diff = 0;
    for (int i = 0; i < size; i++) {
      diff = Math.max(diff, Math.abs(left_max[i] - right_min[i]));
      diff = Math.max(diff, Math.abs(left_min[i] - right_max[i]));
    }

    return diff;
  }
}

Last updated