/** * Find two contiguous subsequences in an array with maximum difference. The * subsequences may be overlapping. * * Tags: Array */ class MaxSubseqDifference { public static void main(String[] args) { int[] A = { -6, -1, -4, -8, -4, -6, -1, -9, -1, -9 }; MaxSubseqDifference m = new MaxSubseqDifference(); System.out.println(m.findMaxDiff(A)); } /** * Find max and min sum contiguous subsequences separately * Then get the difference */ public int findMaxDiff(int[] A) { int[] maxSubArr = maxKadane(A); int[] minSubArr = minKadane(A); int sum1 = printArr(A, maxSubArr[0], maxSubArr[1]); int sum2 = printArr(A, minSubArr[0], minSubArr[1]); return sum1 - sum2; } /** * Find max sum contiguous subsequences */ private int[] maxKadane(int[] A) { int beginTemp = 0; int begin = 0; int end = 0; int maxSoFar = A[0]; int maxEndingHere = A[0]; for (int i = 1; i < A.length; i++) { if (maxEndingHere < 0) { maxEndingHere = A[i]; beginTemp = i; } else maxEndingHere += A[i]; if (maxEndingHere >= maxSoFar) { maxSoFar = maxEndingHere; begin = beginTemp; end = i; } } return new int[]{begin, end}; } /** * Modification of maxKadane to find min sum contiguous subsequence */ private int[] minKadane(int[] A) { int beginTemp = 0; int begin = 0; int end = 0; int minSoFar = A[0]; int minEndingHere = A[0]; for (int i = 1; i < A.length; i++) { if (minEndingHere > 0) { minEndingHere = A[i]; beginTemp = i; } else minEndingHere += A[i]; if (minEndingHere <= minSoFar) { minSoFar = minEndingHere; begin = beginTemp; end = i; } } return new int[]{begin, end}; } int printArr(int[] A, int start, int end) { int sum = 0; for (int i = start; i <= end; i++) { System.out.print(i == end ? A[i] : A[i] + ", "); sum += A[i]; } System.out.println(); return sum; } }