您的位置:首页 > 其它

连续子数组的最大和

2016-05-16 22:49 246 查看
题目:输入一个整型数组,数组里有整数也有负数。数组中一个或连续的多个整数组组成一个整数组。求所有字数组的和的最大值。要求时间复杂度为O(n)。

例如数组:{1, -2, 3,,10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2},因此输出为该字数组的和为18.

首先,想枚举出数组的所有子数组并求出它们的和是行不通的,因为要求了时间复杂度为O(n)。

不过我们可以举例子来分析以下数组的规律。比如从头到尾累加这个数组中的数字,先是1,然后加了-2,sum变成了-1.现在想想,从第一个数字开始的字数组的和回小于从第三个数字开始的字数组的和。因为前边的和为负数了。所以sum应该从3开始加,sum现在等于3了,再加10,变为13,再加-4,sum变为9,那么刚刚的13可能是最大值,可以现将13保存下来。sum继续加7,sum=16,更新sum可能的最大值,再加2,sum=18,再加-5,又要减小了,比较一下sum和保存的sum可能的最大值,然后保存。sum=13.数组现在结束了,我们保存的那个可能的最大值就是连续子数组的最大和了。

如此分析之后,我们就可以写出如下代码了:

enum
{
VALID,
INVALID
}state;

int FindGreatestSumOfSubArray(int arr[], int n)
{
int sum = 0;
int old_sum = 0x80000000;
int i = 0;
state = INVALID;

if (NULL == arr || n <= 0)
return 0;

for (i = 0; i < n; i++)
{
if (sum < 0)
{
sum = arr[i];
}
else
{
sum += arr[i];
}

if (sum > old_sum )
{
old_sum = sum;
}
}
state = VALID;

return old_sum;
}


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