问题描述:
给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。
返回这个最大的差值。
解题思路:
要使绝对值差最大,则一定是Amax-Bmin,或者Bmax-Amin,因此求出A、B子串的局部和的最大最小值,然后取差值最大的。
实现代码:
public class Solution {
public int maxDiffSubArrays(int[] nums) {
// write your code here
int size = nums.length;
int MAX=Integer.MIN_VALUE;
int sum = 0;
for(int i=0;i<size-1;i++){
int amax=max(0,i,nums);
int amin=min(0,i,nums);
int bmax=max(i+1,size-1,nums);//此处注意为size-1
int bmin=min(i+1,size-1,nums);
System.out.println("i="+i);
System.out.println("amax="+amax+" amin="+amin+" bmax="+bmax+" bmin="+bmin);
if((amax-bmin)>(bmax-amin)){
sum=amax-bmin;
}
else{
sum = bmax-amin;
}
if(sum>MAX) MAX=sum;
}
return MAX;
}
public int max(int star,int end,int[] nums){
int max = nums[star];
int sum = 0;
for(int i = star;i<=end;i++){
if(sum <0){
sum = nums[i];
}
else{
sum = sum +nums[i];
}
if(sum > max) max=sum;
}
return max;
}
public int min(int star,int end,int[] nums){
int min = nums[star];
int sum = 0;
for(int i = star;i<=end;i++){//此处注意为小于等于
if(sum > 0){
sum = nums[i];
}
else{
sum = sum +nums[i];
}
if(sum < min) min =sum;
}
return min;
}
public static void main(String[] args){
HelloWord a = new HelloWord();
int[] nu={1,2,-3,1};
int sun = a.maxDiffSubArrays(nu);
System.out.println(sun);
}
}