1. 程式人生 > >Lintcode :45. 最大子陣列差

Lintcode :45. 最大子陣列差

描述

給定一個整數陣列,找出兩個不重疊的子陣列A和B,使兩個子陣列和的差的絕對值|SUM(A) - SUM(B)|最大。

返回這個最大的差值。

子陣列最少包含一個數

樣例

給出陣列[1, 2, -3, 1],返回 6

挑戰

時間複雜度為O(n),空間複雜度為O(n)

思路:與上一題最大子陣列II類似,只是要分情況找到sum(A)最大,sum(B)最小和sum(A)最小,sum(B)最大的情況

public int maxDiffSubArrays(int[] nums) {
        // write your code here
        int[] leftMax = new int[nums.length];
        int[] leftMin = new int[nums.length];
        int[] rightMin = new int[nums.length];
        int[] rightMax = new int[nums.length];
        int curSum = 0;
        int maxSum = nums[0];

        int curDiff = 0;
        int minSum = nums[0];
        for (int i = 0; i < nums.length; i++) {
            curSum += nums[i];
            maxSum = Math.max(maxSum, curSum);
            curSum = Math.max(curSum, 0);
            leftMax[i] = maxSum;

            curDiff += nums[i];
            minSum = Math.min(minSum, curDiff);
            curDiff = Math.min(curDiff, 0);
            leftMin[i] = minSum;
        }

        curSum = 0;
        curDiff = 0;
        maxSum = nums[nums.length - 1];
        minSum = nums[nums.length - 1];
        for (int i = nums.length - 1; i >= 0; i--) {
            curDiff += nums[i];
            minSum = Math.min(minSum, curDiff);
            curDiff = Math.min(curDiff, 0);
            rightMin[i] = minSum;

            curSum += nums[i];
            maxSum = Math.max(maxSum, curSum);
            curSum = Math.max(curSum, 0);
            rightMax[i] = maxSum;
        }

        int result = 0;
        for (int i = 0; i < nums.length - 1; i++) {
            result = Math.max(result, Math.abs(leftMax[i] - rightMin[i + 1]));
            result = Math.max(result, Math.abs(leftMin[i] - rightMax[i + 1]));
        }


        return result;
    }