Maximum Subarray Difference 最大子数组差
Description
Given an array with integers.
Find two non-overlapping subarrays A and B, which |SUM(A) - SUM(B)|∣SUM(A)−SUM(B)∣ is the largest.
Return the largest difference.
public class Solution {
/**
* @param nums: A list of integers
* @return: An integer indicate the value of maximum difference between two substrings
*/
public int maxDiffSubArrays(int[] nums) {
// write your code here
if(nums == null || nums.length == 0){
return 0 ;
}
int size = nums.length ;
int[] left_max = new int[size] ;
int[] left_min = new int[size] ;
int[] right_max = new int[size] ;
int[] right_min = new int[size] ;
int[] copy = new int[size] ;
for(int i = 0 ; i < size ; i++){
copy[i] = -1 * nums[i] ;
}
int max = Integer.MIN_VALUE, sum = 0 , minSum = 0 ;
for(int i = 0 ; i < nums.length ; i++){
sum = sum + nums[i] ;
max = Math.max(max , sum - minSum) ;
minSum = Math.min(sum , minSum) ;
left_max[i] = max ;
}
max = Integer.MIN_VALUE ;
sum = 0 ;
minSum = 0 ;
for(int i = size-1 ; i >= 0 ; i--){
sum = sum + nums[i] ;
max = Math.max(max , sum - minSum) ;
minSum = Math.min(sum , minSum) ;
right_max[i] = max ;
}
max = Integer.MIN_VALUE ;
sum = 0 ;
minSum = 0 ;
for(int i = 0 ; i < size ; i++){
sum += copy[i] ;
max = Math.max(max , sum-minSum ) ;
minSum = Math.min(minSum , sum) ;
left_min[i] = -1 * max ;
}
max = Integer.MIN_VALUE ;
sum = 0 ;
minSum = 0 ;
for(int i = size-1 ; i >= 0 ; i--){
sum += copy[i] ;
max = Math.max(max , sum-minSum ) ;
minSum = Math.min(minSum , sum) ;
right_min[i] = -1 * max ;
}
int diff =0 ;
for(int i= 0 ; i< size -1 ; i++){
diff = Math.max(diff, Math.abs(left_max[i] - right_min[i+1]));
diff = Math.max(diff, Math.abs(left_min[i] - right_max[i+1]));
}
return diff ;
}
}