题目
给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。
思路
循环遍历数组中从每一个位置开始的递增数列的长度然后存入数组,最后检索lenght数组求出最大长度的起始位置,后从此位置开始遍历,lenght[i]就是你要遍历数组的长度。
优化思路:见代码注解。
代码
#include<stdio.h>
#include<stdlib.h>
#define N 100
void findLenght();
int data[N],lenght[N];
int n;
void main(){
int i;
scanf("%d",&n);
//置空
for(i=0;i<n;i++)
lenght[i]=0;
for(i=0;i<n;i++)
scanf("%d",&data[i]);
findLenght();
system("pause");
}
void findLenght(){
int i,j,len,max,index,index1;
i=0;
index1=i;
while(i<n){
len=0;
for(j=i;j<n;j++){
if(j+1<n){
if(data[j]<data[j+1])
len++;
else{
index1=i;//先保存,再进行i的变化
i=j+1;//这里进行一次优化,因为曾序之后的数列肯定是比其起始位置长度小的,所以直接从下一个无需开始检索.
len++;
break;
}
}else{
len++;
index1=i;//同样先保存
i=j+1;
break;
}
}
lenght[index1]=len;
}
//findMAXLength
max=lenght[0];
index=0;
for(i=1;i<n;i++){
printf("%d len=%d\n",i,lenght[i]);
if(lenght[i]>max){
max=lenght[i];
index=i;
}
}
//遍历数组
for(i=index,j=0;j<lenght[index];j++,i++){
printf(" %d",data[i]);
}
}
总结
此代码思路比较简单,要是没有优化其实很容易实现,用到优化的话就要注意一个问题,跳出条件,以及对于i变化之前值的保存,不保存之后lenght【】数组存储位置救护发生变化。