public SubarraySumIndication <T> GetSubarray(IList <T> array) { if (array == null || array.Count == 0) { throw new ArgumentException(); } var arrayTotal = array.Count; var sumCollectionTotal = arrayTotal * (arrayTotal - 1) / 2; SubarraySumIndication <T>[] subarraySums = new SubarraySumIndication <T> [sumCollectionTotal]; var k = 0; dynamic sum; for (var i = 0; i < array.Count - 1; i++) { sum = array[i]; for (var j = i + 1; j < array.Count; j++) { sum = sum + array[j]; subarraySums[k] = new SubarraySumIndication <T>(i, j, sum); k++; } } var maxSumIndex = 0; sum = subarraySums[0].Sum; for (k = 0; k < sumCollectionTotal - 1; k++) { if (subarraySums[k + 1].Sum.CompareTo(sum) > 0) { maxSumIndex = k + 1; sum = subarraySums[maxSumIndex].Sum; } } return(subarraySums[maxSumIndex]); }
public SubarraySumIndication <T> GetSubarray(IList <T> array) { if (array == null || array.Count == 0) { throw new ArgumentException(); } SubarraySumIndication <T> maxSumSubarrayOfFull = new SubarraySumIndication <T>(0, 0, array[0]); SubarraySumIndication <T> maxSumSubarrayEndingAtRight = new SubarraySumIndication <T>(0, 0, array[0]); dynamic fullMaxSum, endingAtRightSum, newElement; for (var i = 1; i < array.Count; i++) { fullMaxSum = maxSumSubarrayOfFull.Sum; endingAtRightSum = maxSumSubarrayEndingAtRight.Sum; newElement = array[i]; if (maxSumSubarrayOfFull.EndIndex == i - 1) { if (newElement >= 0) { fullMaxSum += newElement; maxSumSubarrayOfFull = new SubarraySumIndication <T>(maxSumSubarrayOfFull.StartIndex, i, fullMaxSum); maxSumSubarrayEndingAtRight = new SubarraySumIndication <T>(maxSumSubarrayOfFull.StartIndex, i, fullMaxSum); } else { endingAtRightSum += newElement; maxSumSubarrayEndingAtRight = new SubarraySumIndication <T>(maxSumSubarrayEndingAtRight.StartIndex, i, endingAtRightSum); } } else { if (newElement >= 0) { if (endingAtRightSum >= 0) { endingAtRightSum += newElement; maxSumSubarrayEndingAtRight = new SubarraySumIndication <T>(maxSumSubarrayEndingAtRight.StartIndex, i, endingAtRightSum); } else { endingAtRightSum = newElement; maxSumSubarrayEndingAtRight = new SubarraySumIndication <T>(i, i, endingAtRightSum); } if (fullMaxSum < endingAtRightSum) { fullMaxSum = endingAtRightSum; maxSumSubarrayOfFull = new SubarraySumIndication <T>(maxSumSubarrayEndingAtRight.StartIndex, maxSumSubarrayEndingAtRight.EndIndex, endingAtRightSum); } } else { endingAtRightSum += newElement; maxSumSubarrayEndingAtRight = new SubarraySumIndication <T>(maxSumSubarrayEndingAtRight.StartIndex, i, endingAtRightSum); } } } return(maxSumSubarrayOfFull); }