想了好久
本来搞了两个循环,stack overflow了......
后来想想用一个循环来实现
(之所以想要两个循环是因为本来想着一旦遇到降序大串就回溯,但是想到KMP算法,这个回溯根本没有意义,因为当前已经是连续递增序列了,回溯了只会是当前序列的子序列,回溯根本没有意义)
(可是到目前为止还是没有学会怎么求KMP算法中的next数组,orz....以后慢慢学吧)
每次看大佬题解都不敢细看,总是幻想能有一些新思路然后自己去写
比如这次,看别人只用了一个循化,自己也去思考如何用一个循环写出来
总而言之,菜是原罪......
#include <stdio.h>
const int max = 100005;
int main()
{
int start,length,maxlength=1,i,j,n;
int a[max];
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]); //读入数组
start = 0;
length = 1;
for(i=1;i<n;i++)
{
if(a[i]>a[i-1])
length++;
else
length = 1; //一旦找到逆序,长度重置
if(length>maxlength) //实时更新当前最大长度与开始位置
{
maxlength = length;
start = i-length+1;
}
}
for(i=start;i<start+maxlength;i++)
{
printf("%d",a[i]);
if(i != start+maxlength-1) printf(" "); //最后空格要处理好
}
return 0;
}