Lintcode - Maximum Subarray Difference

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.

Note

The subarray should contain at least one number

Example

For [1, 2, -3, 1], return 6

Challenge

O(n) time and O(n) space.

思路很簡單,寫起來很煩躁。分別左右兩邊求連續最大最小值,相當於把maximum subarray寫四遍。。。然後比較leftMax-rightMin vs rightMax - leftMin

    public int maxDiffSubArrays(ArrayList<Integer> nums) {
        int max = Integer.MIN_VALUE;
        if (nums.size() <2) {
            return 0;
        }
        int n = nums.size();
        int[] leftMax = new int[n], leftMin = new int[n],

        int localMax = 0; int localMin = 0;
        for (int i = 0; i < n; i++) {
            int num = nums.get(i);
            
            localMax = Math.max(num + localMax, num);
            localMin = Math.min(num + localMin, num);
            if (i == 0) {
                leftMax[i] = localMax;
                leftMin[i] = localMin;
            } else {
                leftMax[i] = Math.max(localMax, leftMax[i-1]);
                leftMin[i] = Math.min(localMin, leftMin[i-1]);
            }
        }

        localMax = 0; localMin = 0;
        int lastMax = 0, lastMin = 0;
        for (int i = n-1; i > 0; i--) {
            int num = nums.get(i);
            localMax = Math.max(num + localMax, num);
            localMin = Math.min(num + localMin, num);
            if (i == n-1) {
                lastMax = localMax;
                lastMin = localMin;
            } else {
                lastMax = Math.max(localMax, lastMax);
                lastMin = Math.min(localMin, lastMin);
            }
            max = Math.max(Math.max(Math.abs(leftMax[i-1]-lastMin), 
                Math.abs(lastMax - leftMin[i-1])), max);
        }
        return max;
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章