您的位置:首页 > 其它

求子数组的最大和

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;
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: