/// <summary> /// Finds the maximum sum sub array by brute force method. /// </summary> /// <param name="a">input array.</param> /// <returns>Returns sub array [start index, end index] having maximum sum</returns> public static SubArraySumResult FindMaxSumSubArrayByBruteForceMethod(int[] a) { SubArraySumResult result = new SubArraySumResult(); int lastSubArrayStartIndex = 0; for (int i = 0; i < a.Length; i++) { for (int j = i; j < a.Length; j++) { var currSubArraySum = GetSum(a, i, j); if (currSubArraySum > result.Sum) { result.Sum = currSubArraySum; result.SubArrayIndexes.Clear(); result.SubArrayIndexes.Add(new Tuple <int, int>(i, j)); lastSubArrayStartIndex = i; } else if (currSubArraySum == result.Sum && lastSubArrayStartIndex != i) { /* Reason for the check => (lastSubArrayStartIndex != i): * If the current subarray with max-sum includes * the previously added subarray * then do not add the subarray as max-sum subarray * Example: 0-3 = 10 and 0-5 = 10 then * do no consider the second sub-array ranging 0-5 as max-sum subarray. */ result.SubArrayIndexes.Add(new Tuple <int, int>(i, j)); lastSubArrayStartIndex = i; } } } return(result); }
/// <summary> /// Finds the maximum sum sub array using kadanes algorithm. /// </summary> /// <param name="a">input array.</param> /// <returns>Returns sub array [start index, end index] having maximum sum</returns> public static SubArraySumResult FindMaxSumSubArrayByKadanesAlgorithmCustom(int[] a, int endElement) { var result = new SubArraySumResult() { Sum = 0 }; long maxSumEndingHere = 0; int startIndex = -1, endIndex = -1; if (a.Length > 0) { result.Sum = a[0]; startIndex = 0; endIndex = 0; maxSumEndingHere = a[0]; result.SubArrayIndexes.Add(new Tuple <int, int>(startIndex, endIndex)); } for (int i = 1; i < a.Length; i++) { var maxSumEndingHereTemp = maxSumEndingHere + a[i]; if (maxSumEndingHereTemp > a[i]) { maxSumEndingHere = maxSumEndingHereTemp; endIndex = i; } else // a[i] >= maxSumEndingHereTemp { maxSumEndingHere = a[i]; startIndex = i; endIndex = i; } if (maxSumEndingHere > result.Sum) { result.Sum = maxSumEndingHere; result.SubArrayIndexes.Clear(); result.SubArrayIndexes.Add(new Tuple <int, int>(startIndex, endIndex)); } else if (maxSumEndingHere == result.Sum) { result.SubArrayIndexes.Add(new Tuple <int, int>(startIndex, endIndex)); } if (a[i] == endElement) { maxSumEndingHere = 0; startIndex = endIndex = i + 1; } } return(result); }