您的位置:首页 > 理论基础 > 数据结构算法

数据结构课程笔记--(1)求最大子列的问题

2016-03-18 10:18 483 查看
1.题目一








------------------------------------算法一:在线解决

#include<stdio.h>
int max(int L[],int N);
int main()
{
int L[100000],N,i;
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%d",&L[i]);
printf("%d\n",max(L,N));
return 0;
}
int max(int L[],int N)
{
int i,j,thissum,maxsum=0;
for (i=0;i<N ;i++ )
{
thissum+=L[i];
if (thissum>maxsum)
maxsum = thissum;
else if(thissum<0)
thissum=0;
}
return maxsum;
}




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

-------------------------------算法二:两个循环

算法二:
#include<stdio.h>
int max(int L[],int N);
int main()
{
int L[100000],N,i;
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%d",&L[i]);
printf("%d\n",max(L,N));
return 0;
}
int max(int L[],int N)
{
int thissum,maxsum=0;
int i,j;
for (i=0;i<N ;i++ ){
thissum = 0;
for (j=i;j<N ; j++)
{
thissum += L[k];
if(thissum > maxsum)
maxsum = thissum;
}
}
return maxsum;
}





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

2.题目2:不但求最大子列的和,还有最大子列的元素

#include<stdio.h>
int max(int L[],int N);
int main()
{
int L[100000],N,i;
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%d",&L[i]);
max(L,N);
return 0;
}
int max(int L[],int N)
{
int thissum,maxsum=0;
int i,j,k=0;
int left,right;
for (i=0;i<N ;i++ ){
thissum = 0;
if(L[i] <= 0){
k++;
}
for (j=i;j<N ; j++)
{
thissum += L[j];
if(thissum > maxsum){
maxsum = thissum;
right = L[j];
left = L[i];
}
}
}
if(k == N){
printf("%d %d %d\n",0,L[0],L[N-1]);
}else{
printf("%d %d %d\n",maxsum,left,right);
}
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: