习题3.4 最长连续递增子序列 (20point(s))
用两个指针实时记录连续递增序列的位置
o(n)
#include<iostream>
#include<stdio.h>
#include <stdlib.h>
using namespace std;
const int MAXSIZE = 100000 + 10;
int data[MAXSIZE];
int main(){
int n;
cin>>n;
for(int i=0;i<n;++i)
cin>>data[i];
int maxLeft=0,maxRight=0,maxLen=1;
int thisLeft=0,thisRight=0,thisLen=1;
for(int i=1;i<n;++i){
if(data[i]>data[i-1]){
thisRight=i;
thisLen++;
}
else{
if(thisLen>maxLen){
maxLen=thisLen;
maxLeft=thisLeft;
maxRight=thisRight;
}
thisLen=1;
thisLeft=thisRight=i;
}
}
if(thisLen>maxLen){
maxLen=thisLen;
maxLeft=thisLeft;
maxRight=thisRight;
}
for(int i=0;i<maxLen;++i){
cout<<data[maxLeft+i];
if(i<maxLen-1)
cout<<" ";
else
cout<<endl;
}
}
以前按照标准答案写的
#include<stdio.h>
#include <stdlib.h>
const int MAXSIZE = 100000 + 10;
typedef int ElementType;
typedef int Position;
typedef struct LNode* List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last;
};
//自定义建表List ReadInput()
List ReadInput()
{
List L;
L = (List)malloc(sizeof(struct LNode));
int n;
scanf("%d", &n);
for (L->Last = 0; L->Last < n; ++L->Last)
scanf("%d", &L->Data[L->Last]);
L->Last--;
return L;
}
//输出打印show(List L,Position left,Position right)
void show(List L, Position left, Position right)
{
for (Position i = left; i < right; ++i)
printf("%d ", L->Data[i]);
printf("%d\n", L->Data[right]);
}
int main()
{
List list;
Position left, right, thisleft, thisright;
left = right = thisleft = thisright = 0;
int maxlen = 1, thislen = 1;
list = ReadInput();
for (int i = 1; i <= list->Last; ++i)
{
if (list->Data[i - 1] < list->Data[i])
{
thisright++, thislen++;
}
else
{
if (thislen > maxlen)
{
maxlen = thislen;
left = thisleft;
right = thisright;
}
thislen = 0;
thisleft = thisright = i;
}
}
if (thislen > maxlen)
{
maxlen = thislen;
left = thisleft;
right = thisright;
}
show(list, left, right);
}