码迷,mamicode.com
首页 > 其他好文 > 详细

给定N个整数的序列,求函数的最大值

时间:2015-03-09 22:08:11      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

题目:给定N个整数的序列技术分享,求函数技术分享的最大值。

算法1:

int maxSubseqSum1(int A[],int N)
{
    int ThisSum,maxSum=0;
    int i,j,k;
    for(i=0;i<N;i++)//i是子列左端位置
    {
        for(j=i;i<N;j++)//j是子列右端位置
        {
            ThisSum=0;//ThisSum是从A[i]到A[j]的子列和
            for(k=i;k<=j;k++)
                ThisSum+=A[k];
            if(ThisSum>MaxSum)//如果刚得到的这个子列和更大
                MaxSum=ThisSum;//则更新结果
        }//j循环结束
    }//i循环结束
    return MaxSum;
}

时间复杂度:T(N)=O(N3

算法2:

int maxSubseqSum2(int A[],int N)
{
    int ThisSum,maxSum=0;
    int i,j;
    for(i=0;i<N;i++)//i是子列左端位置
    {
        ThisSum=0;//ThisSum是从A[i]到A[j]的子列和
        for(j=i;i<N;j++)//j是子列右端位置
        {
                ThisSum+=A[j];
                //对于相同的i,不同的j,只要在j-1次循环的基础上累加1即可
            if(ThisSum>MaxSum)//如果刚得到的这个子列和更大
                MaxSum=ThisSum;//则更新结果
        }//j循环结束
    }//i循环结束
    return MaxSum;
}

时间复杂度T(N)=O(N2

 

算法3:

int MaxSubseqSum3(int A[],int N)
{
    int ThisSum,MaxSum;
    int i=0;
    ThisSum=MaxSum=0;
    for(i=0;i<N;i++)
    {
        ThisSum+=A[i];//向右累加
        if(ThisSum>maxSum)
        {
            maxSum=ThisSum;//发现更大和则更新当前结果
        }
        else if(ThisSum<0)//如果当前子列和为负
            ThisSum=0;//则不可能使后面的部分和增大,抛弃之
    }
    return MaxSum;
}

时间复杂度:T(N)=O(N);

“在线”的意思是指每输入一个数据就进行即时处理,在任何一个地方中止输入,算法都能正确给出当前的解。

给定N个整数的序列,求函数的最大值

标签:

原文地址:http://www.cnblogs.com/heisaijuzhen/p/4324474.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!