求最大子序列的和
传统的嵌套循环的解法:
/////获得最大子序列的和,复杂度O(n^2)
int GetMaxSubSequence(int* arr,int len)
{
int i, j;
int curSum; /* 当前序列和 */
int maxSum; /* 最大序列和 */
/* 初始化最大子序列和为序列第一个元素 */
maxSum = arr[0];
/* 外层循环定义子序列起始位置 */
for (i = 0; i < len; i++)
{
/* 起始位置为i,初始化当前和为0 */
curSum = 0;
/* 内层循环定义子序列结束位置 */
for (j = i; j < len; j++)
{
/* 计算子序列和,并与最大子序列和比较,更新最大子序列和 */
curSum = curSum + arr[j];
/* 与最大子序列和比较,更新最大子序列和 */
if (curSum > maxSum)
{
maxSum = curSum;
}
}
}
return maxSum;
}
高效的解法:
////获得最大子序列的和,复杂度O(n)
int GetMaxSubSeq(int* arr,int len)
{
////非法参数的情况
if(arr==NULL || len < 0)
{
return -1;
}
////全是负数的情况
int index = 0;
int maxNum = arr[0];
for(int i = 0;i<len;i ++){
if(arr[i] < 0)
{
index++;
maxNum = maxNum > arr[i] ? maxNum:arr[i];
}
else
{
break;
}
}
if(index == len)
{
return maxNum;
}
////不全是负数的情况
int sum = 0;
int max = 0;
for(int i=0;i < len;i ++)
{
sum += arr[i];
max=max<sum?sum :max;
sum=sum>0?sum:0;
}
return max;
}
////测试结果
int _tmain(int argc, _TCHAR* argv[])
{
int *arr = new int[100];
arr[0]=1;
arr[1]=-3;
arr[2]=5;
arr[3]=6;
arr[4]=7;
int maxSum = GetMaxSubSeq(arr,5);
cout<<maxSum<<endl;
delete[] arr;
cin.get();
return 0;
}