Exemple #1
0
        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]);
        }
Exemple #2
0
        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);
        }