给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。
输入格式:
输入第1行给出正整数nnn(≤105\le 10^5≤105);第2行给出nnn个整数,其间以空格分隔。
输出格式:
在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。
输入样例:
15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10
输出样例:
3 4 6 8
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxsize 1000000
using namespace std;
typedef int element;
typedef struct
{
element * elem;
int length;
int listsize;
}sq;
struct match
{
int c;
int flag;
}m;
int lintlist(sq & l)
{
l.elem = (element *)malloc(maxsize * sizeof(element));
if(!l.elem)
return -1;
l.length = 0;
l.listsize = maxsize;
return 0;
}
void creat(sq & l, int n)
{
for(int i = 0; i < n; i++)
cin >> l.elem[i];
l.length = n;
}
void find(sq & l1, sq & l2)
{
for(int i = 0; i < l1.length; i++)
{
int count = 0;
for(int j = i; j < l1.length; j++)
{
if(l1.elem[j] < l1.elem[j + 1])
{
count++;
l2.elem[i] = count;
}
else
break;
}
}
int max = -1;
int flag;
for(int i = 0; i < l1.length; i++)
{
if(max < l2.elem[i])
{
max = l2.elem[i];
flag = i;
}
}
for(int i = flag; i < flag + max ; i++)
cout << l1.elem[i] << " ";
cout <<l1.elem[flag + max ] << endl;
}
int main()
{
sq l1, l2;
int n;
cin >> n;
lintlist(l1);
creat(l1,n);
lintlist(l2);
find(l1,l2);
return 0;
}