最大子数组差
题目
给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。
返回这个最大的差值。注意事项
子数组最少包含一个数样例
给出数组[1, 2, -3, 1],返回 6
挑战
时间复杂度为O(n),空间复杂度为O(n)
题解
沿用42.Maximum Subarray II-最大子数组 II(中等题)的思路,求出左右子数组的最大值和最小值,再求差的最大绝对值。由于无法判断最大子数组和最小子数组分别出现在左边还是右边,所以需要将数组反转后再求一次,最后选出最大值。
public class Solution {
/**
* @param nums: A list of integers
* @return: An integer indicate the value of maximum difference between two
* Subarrays
*/
public int maxDiffSubArrays(int[] nums) {
int a = getMaxAbs(nums);
reverse(nums,0,nums.length-1);
return Math.max(a,getMaxAbs(nums));
}
private int getMaxAbs(int[] nums)
{
int size = nums.length;
int[] left = new int[size];
int[] right = new int[size];
int max = Integer.MIN_VALUE;
for(int i = 0,sum = 0; i < size; i++)
{
sum += nums[i];
max = Math.max(max, sum);
if(sum < 0)
{
sum = 0;
}
left[i] = max;
}
max = Integer.MAX_VALUE;
for(int i = size - 1,sum = 0; i >= 0; i--)
{
sum += nums[i];
max = Math.min(max, sum);
if(sum > 0)
{
sum = 0;
}
right[i] = max;
}
max = Integer.MIN_VALUE;
for(int i = 0; i < size - 1; i++)
{
max = Math.max(max, Math.abs(left[i] - right[i + 1]));
}
return max;
}
private void reverse(int[] arr, int start, int end)
{
while (start < end)
{
int temp = arr[end];
arr[end--] = arr[start];
arr[start++] = temp;
}
}
}
Last Update 2016.9.29