习题3.4 最长连续递增子序列
初学者把每天刷的题记录一下,以便于自己今后的复习,如果也能帮到别人,那我也很荣幸
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 100000
typedef struct LNode *List;
struct LNode{
int Date[MAXSIZE];
int Last;
};//定义List结构
List ReadInput()//输入顺序表
{
List L;
int N;
L=(List)malloc(sizeof(struct LNode));
scanf("%d\n",&N);
for(L->Last=0;L->Last<N;L->Last++)
scanf("%d",&L->Date[L->Last]);//从0到n-1存储到线性表的数据域
L->Last--;
return L;
}
void PrintReault(List L,int Left,int Right)//输出结果
{
int i;
printf("%d",L->Date[Left]);//输出左端点不带空格
for(i=Left+1;i<=Right;i++)//右边剩下依次输出,带空格
printf(" %d",L->Date[i]);
printf("\n");
}
int main()
{
List L;
int Left,Right,thisL,thisR,i; //Left,Right 当前最长序列的左,右端下表,thisL,thisR 正在查找序列的左右下表
int maxLen,thisLen; //最大长度和当前访问子序列的长度
L=ReadInput();
Left=Right=thisL=thisR=0;//初始化
maxLen=thisLen=1; //默认第一个元素是最大的长度序列
for(i=1;i<=L->Last;i++)
{
if(L->Date[i]>L->Date[i-1])//如果是递增序列
{
thisLen++;
thisR++;
}
else //不是递增的
{
if(thisLen>maxLen) //判断刚访问的序列长度与最大长度的大小关系
{
maxLen=thisLen;
Left=thisL;
Right=thisR;
}
thisLen =1; //为下个段的比较初始化
thisL=thisR=i;
}
}
if(thisLen>maxLen) //全递增情况,没有比较thislen就出循环在这里再比较一次
{
maxLen=thisLen;
Left=thisL;
Right=thisR;
}
PrintReault(L,Left,Right);
return 0;
}