题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值以及子数组的上下边界。要求时间复杂度为O(n)。
自己写的代码如下:
#include <iostream.h>
#define ARR_SIZE 10
//求最大和
int maxSubArr(int* arr, int n, int& begin, int& end)
{
int curSum = 0;
int maxSum = 0;
int curBegin = 0;
int curEnd = 0;
begin = end = 0;
for (int i=0; i<n; i++)
{
curSum += arr[i];
if (curSum < 0)
{
curSum = 0;
if (i+1<n)
{
curBegin = curEnd = (i+1);
}
}
else if (curSum > maxSum)
{
maxSum = curSum;
begin = curBegin;
end = curEnd;
curEnd++;
}
else{curEnd++;}
}
return maxSum;
}
void main()
{
int arr[ARR_SIZE] = {1,-2,3,-1};
int a,b;
cout<<maxSubArr(arr, ARR_SIZE,a,b)<<endl;
cout<<arr[a]<<" "<<arr[b]<<endl;
}