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;}