求最大子序列的和

 

求最大子序列的和

 

传统的嵌套循环的解法:

 

 

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


 

 

你可能感兴趣的:(求最大子序列的和)