求最大子序列的和

时间:2022-02-08 10:49:07

 

求最大子序列的和

 

传统的嵌套循环的解法:

 

 

/////获得最大子序列的和,复杂度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;
}