第3题求子数组的最大和

3.求子数组的最大和
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。

如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常遗憾的是,由于长度为n的数组有O(n2)个子数组;而且求一个长度为n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n3)
很容易理解,当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。基于这样的思路,我们可以写出如下代码。
参考代码:

class Program
    {
        static void Main(string[] args)
        {
           int[] array ={ 1, -2, 3, 10, -4, 7, 2, -5 };
           int childSum=MaxSum(array);
           Console.WriteLine(childSum);
           Console.ReadKey();

        }
        public static int MaxSum(int[] a)
        {
            int max = a[0];
            int result = 0;
            for (int i = 0; i < a.Length; i++)
            {
                result += a[i];
                if (result > max)
                    max = result;
                if (result <=0)
                    result = 0;
            }
            return  max;  
        }
    }

posted @ 2011-07-24 14:39  meifage2  阅读(190)  评论(0编辑  收藏  举报