代码改变世界

求子数组的最大和

2011-08-28 11:30  DylanChan  阅读(432)  评论(4编辑  收藏  举报

 怀念对算法的酷爱,决定搜集网上的算法题目,并持之以恒练习之

    /*
        题目:求子数组的最大和
        输入一个整形数组,数组里有正数也有负数。
        数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
        求所有子数组的和的最大值。要求时间复杂度为O(n)。
        例如输入的数组为3, 0, -1, 5, -7, 9, -6, 4, -8, 10,和最大的子数组为10,
        因此输出为该子数组的和10。
     * 思路:
            遍历数组,逐个相加,若和小于0,遍历从下一索引开始,并记下此时的索引(min)与子数组和(       subArraySum);
            定义一个变量 maxSubArray 存储子数组的和,并每次与之比较,若小于子数组和,则更改               maxSubArray的值,让其等于subArraySum的值,并记下此时的索引值(max)
     */
    class Program
    {
        static void Main(string[] args)
        {
            int[] array = { 3, 0, -1, 5, -7, 9, -6, 4, -8, 10 };
            int start, end;
            int max = MaxOfSubArray(array, out start, out end);
            Console.Write("最大的子数组:");
            for (int i = start; i <= end; i++)
            {
                Console.Write(array[i]);
                if (i != end)
                {
                    Console.Write(",");
                }
            }
            Console.Write("\n");
            Console.WriteLine("该数组的和:{0}", max);
            /*
             * * 输出结果 * *
             * 
                  最大的子数组:10
                  该数组的和:10
             * 
             */
        }

        static int MaxOfSubArray(int[] array, out int start, out int end)
        {
            start = -1;
            end = -1;
            //子数组和
            int subArraySum = 0;
            //子数组和最大值
            int maxSubArray = 0;
            for (int i = 0; i < array.Length; i++)
            {
                if (subArraySum < 0)
                {
                    subArraySum = array[i];
                    start = i;
                }
                else
                {
                    subArraySum += array[i];
                }
                if (subArraySum > maxSubArray)
                {
                    maxSubArray = subArraySum;
                    end = i;
                }
            }
            return maxSubArray;
        }
    }