求子数组的最大和
2011-08-28 11:30
239 查看
怀念对算法的酷爱,决定搜集网上的算法题目,并持之以恒练习之
/* 题目:求子数组的最大和 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为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; } }