给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列
问题分析
- 从某个位置出发,找当前连续递增的子序列,并记录长度和首尾位置
- 找出最大长度
- 找出最长连续递增子序列中左端点最靠左的序列
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 100000
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode{
ElementType Date[MAXSIZE];
Position Last;
};//定义List结构
List ReadInput()//输入顺序表
{
List L;
int N;
L=(List)malloc(sizeof(struct LNode));
scanf("%d",&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,Position Left,Position Right)//输出结果
{
Position i;
printf("%d",L->Date[Left]);//输出左端点
for(i=Left+1;i<=Right;i++)//右边剩下依次输出
printf("%d",L->Date[i]);
printf("\n");
}
int main()
{
List L;
Position Left,Right,thisL,thisR,i;
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)
{
maxLen=thisLen;
Left=thisL;
Right=thisR;
}
printResult(L,Left,Right);
return 0;
}