给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。
返回这个最大的差值。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出数组[1, 2, -3, 1],返回 6
注意
子数组最少包含一个数
挑战
标签 Expand 时间复杂度为O(n),空间复杂度为O(n)
相关题目 Expand
解题思路:
先从左往右求出数组的第i位的最大子数组和maxleft[ ]以及最小子数组和minleft[ ]
先从右往左求出数组的第i位的最大子数组和maxright[ ]以及最小子数组和minright[ ]
public class Solution {
/**
* @param nums: A list of integers
* @return: An integer indicate the value of maximum difference between two
* Subarrays
*/
public int maxDiffSubArrays(ArrayList<Integer> nums) {
// write your code
if(nums==null||nums.size()==0) return 0;
int res = Integer.MIN_VALUE;
int len = nums.size();
int maxleft[] = new int[len];
int sum = 0;
int max = Integer.MIN_VALUE;
int minsum = 0;
for(int i=0;i<len;i++){
sum += nums.get(i);
max = Math.max(max, sum-minsum);
minsum = Math.min(sum, minsum);
maxleft[i] = max;
}
int minleft[] = new int[len];
int maxsum = 0;
sum = 0;
int min = Integer.MAX_VALUE;
for(int i= 0;i<len;i++){
sum += nums.get(i);
min = Math.min(min, sum-maxsum);
maxsum = Math.max(maxsum, sum);
minleft[i] = min;
}
int maxright[] = new int[len];
sum = 0;
max = Integer.MIN_VALUE;
minsum = 0;
for(int i=len-1;i>=0;i--){
sum += nums.get(i);
max = Math.max(max, sum-minsum);
minsum = Math.min(sum, minsum);
maxright[i] = max;
}
int minright[] = new int[len];
maxsum = 0;
sum = 0;
min = Integer.MAX_VALUE;
for(int i= len-1;i>=0;i--){
sum += nums.get(i);
min = Math.min(min, sum-maxsum);
maxsum = Math.max(maxsum, sum);
minright[i] = min;
}
//求|SUM(A) - SUM(B)|
for(int i=0;i<len-1;i++){
res = Math.max(Math.abs(maxleft[i]-minright[i+1]), res);
res = Math.max(Math.abs(minleft[i]-maxright[i+1]), res);
}
return res;
}
}