题目:
一个有N个整数元素的一维数组,这个数组当然有很多子数组,那么子数组之和的最大值是什么呢?
例如有如下数组,
-2,5,3,6,4,-8,6
一个有N个整数元素的一维数组,这个数组当然有很多子数组,那么子数组之和的最大值是什么呢?
例如有如下数组,
-2,5,3,6,4,-8,6
那么最大子数组是5,3 最大值是8
思路:可以把每个正数的子数组求出来,分别计算最大值,取最大的,如例题数组有3个正数的子数组
分别为5,3 6 和 8 ,最大值是 5,3 的子数组
以上为错误思路,可以把数组的项加起来,用一个变量储存最大值,一个变量储存相加得到的值,
若相加得到的值小于0;说明再加下去必然得不到最大值,此时将重新计算相加得到的值,每次相加
得到的值如果大于最大值,则刷新最大值。算法复杂度为 n
/*
#include<iostream>
using namespace std;
int maxPlus(int *array, int len)
{
if (len < 2)
{
cout << "数组只有一个元素" << endl;
return array[0];
}
int j = 0;
int k = 0; //j为子数组第一个正数的下标,k为最后一个正数的下标
int maxValue = 0; //子数组最大值
int n = 0; //记录第一个正数是否已被找到,如果被找到则置为1,否则为0
for (int i = 0; i < len; i++)
{
//如果第一个正数下标没找到,找出子数组第一个正数下标
if (!n)
{
if (array[i] > 0)
{
j = i;
n = 1;
}
}
//如果第一个正数下标已经找到,则找第二个正数下标
if (n)
{
int count = 0; //计算子数组的值
if (array[i] < 0 || i == len -1)
{
if (array[i] < 0)
k = i - 1;
else if (i == len - 1)
k = i;
//计算子数组的值
for (int h = j; h <= k; h++)
count += array[h];
//将第一个正数下标设置为未找到状态
n = 0;
//比较子数组的值最大值
if (count > maxValue)
maxValue = count;
}
}
}
return maxValue;
}
int main()
{
int array[] = { -2, 5, 3, -6, 4,7, -8, 8 };
int len = sizeof(array) / sizeof(array[0]);
cout << len << endl;
int maxValue = 0;
maxValue = maxPlus(array, len);
cout << maxValue << endl;
system("pause");
return 0;
}*/
//以上注释的代码为错误代码
#include<iostream>
using namespace std;
int max(int x, int y)
{
return (x > y) ? x : y;
}
int maxSum(int *A, int len)
{
int start = A[len - 1];
int all = A[len - 1];
for (int i = len - 2; i >= 0; i--)
{
if (start < 0)
start = 0;
start += A[i];
if (start > all)
all = start;
}
return all;
}
int main()
{
int A[] = { -2, 5, 3, -1, 2, -8 };
int len = sizeof(A) / sizeof(A[0]);
int max = 0;
max = maxSum(A, len);
cout << max << endl;
system("pause");
return 0;
}