您的位置:首页 > 其它

连续子数组的最大和

2016-03-18 12:04 441 查看
题目:输入一个整型数组,数组里面有正数也有负数。数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为o(n)。
解析:例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。
方法一:时间复杂度为o(n*n*n)的解法,枚举数组的所有子数组并求出它们的和。
int FindGreatestSumOfSubArray(vector<int> &ve)
{
int sumMax = -1;
for (int k = 0; k < ve.size(); ++k)
{
for (int i = 0; i < ve.size() - k; ++i)
{
int sumCur = 0;
for (int j = i; j < ve.size() - k; ++j)
{
sumCur += ve[j];
}
if (sumMax < sumCur)
{
sumMax = sumCur;
}
}
}
return sumMax;
}
方法二:时间复杂度为o(n*n)的解法,同样也是枚举所有的情况,用到了上一次求值的结构。把o(n*n*n)降低为o(n*n)。
int FindGreatestSumOfSubArray(vector<int> ve)
{
int size = ve.size();
int sum_max = 0x80000000;
for (int i = 0; i < size; ++i)
{
int sum_cur = 0;
for (int j = i; j < size; ++j)
{
sum_cur += ve[j];
if (sum_max < sum_cur)
sum_max = sum_cur;
}
}
return sum_max;
}
方法三:时间复杂度为o(n)。
int FindGreatestSumOfSubArray(vector<int> array) {
int size = array.size();
//数组长度为0时,返回0
if(size == 0)
return 0;
//当前连续子数组的最大和
int sum_max = 0x80000000;
//以当前元素结尾的连续子数组最大和
int sum_sub_max = 0;
for(int i = 0; i < size; ++i){
if(sum_sub_max <= 0){
sum_sub_max = array[i];
}
else{
sum_sub_max += array[i];
}

if(sum_max < sum_sub_max){
sum_max = sum_sub_max;
}
}
return sum_max;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: