Maximum absolute difference between sum of two contiguous sub-arrays - GeeksforGeeks
Given an array of integers, find two non-overlapping contiguous sub-arrays such that the absolute difference between the sum of two sub-arrays is maximum.
 
 
 
 
 
 
 
 
 
 
 
 
Read full article from Maximum absolute difference between sum of two contiguous sub-arrays - GeeksforGeeks
Given an array of integers, find two non-overlapping contiguous sub-arrays such that the absolute difference between the sum of two sub-arrays is maximum.
// Find maximum subarray sum for subarray [0..i]// using standard Kadane's algorithm. This version of// Kadane's Algorithm will work if all numbers are// negative.int maxLeftSubArraySum(int a[], int size, int sum[]){    int max_so_far = a[0];    int curr_max = a[0];    sum[0] = max_so_far;    for (int i = 1; i < size; i++)    {        curr_max = max(a[i], curr_max + a[i]);        max_so_far = max(max_so_far, curr_max);        sum[i] = max_so_far;    }    return max_so_far;}// Find maximum subarray sum for subarray [i..n]// using Kadane's algorithm. This version of Kadane's// Algorithm will work if all numbers are negativeint maxRightSubArraySum(int a[], int n, int sum[]){    int max_so_far = a[n];    int curr_max = a[n];    sum[n] = max_so_far;    for (int i = n-1; i >= 0; i--)    {        curr_max = max(a[i], curr_max + a[i]);        max_so_far = max(max_so_far, curr_max);        sum[i] = max_so_far;    }    return max_so_far;}// The function finds two non-overlapping contiguous// sub-arrays such that the absolute difference// between the sum of two sub-array is maximum.int findMaxAbsDiff(int arr[], int n){    // create and build an array that stores    // maximum sums of subarrays that lie in    // arr[0...i]    int leftMax[n];    maxLeftSubArraySum(arr, n, leftMax);    // create and build an array that stores    // maximum sums of subarrays that lie in    // arr[i+1...n-1]    int rightMax[n];    maxRightSubArraySum(arr, n-1, rightMax);    // Invert array (change sign) to find minumum    // sum subarrays.    int invertArr[n];    for (int i = 0; i < n; i++)        invertArr[i] = -arr[i];    // create and build an array that stores    // minimum sums of subarrays that lie in    // arr[0...i]    int leftMin[n];    maxLeftSubArraySum(invertArr, n, leftMin);    for (int i = 0; i < n; i++)        leftMin[i] = -leftMin[i];    // create and build an array that stores    // minimum sums of subarrays that lie in    // arr[i+1...n-1]    int rightMin[n];    maxRightSubArraySum(invertArr, n - 1, rightMin);    for (int i = 0; i < n; i++)        rightMin[i] = -rightMin[i];    int result = INT_MIN;    for (int i = 0; i < n - 1; i++)    {        /* For each index i, take maximum of        1. abs(max sum subarray that lies in arr[0...i] -            min sum subarray that lies in arr[i+1...n-1])        2. abs(min sum subarray that lies in arr[0...i] -            max sum subarray that lies in arr[i+1...n-1]) */        int absValue = max(abs(leftMax[i] - rightMin[i + 1]),                        abs(leftMin[i] - rightMax[i + 1]));        if (absValue > result)            result = absValue;    }    return result;}