题目:给定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);
“在线”的意思是指每输入一个数据就进行即时处理,在任何一个地方中止输入,算法都能正确给出当前的解。
时间: 2024-11-16 05:53:27