首先,最长不重复子序列是什么:如 一个已知数列p
它的非重复数列有两种
一个是1,2;
另一个是2,3,4,5;那我们可知对于最长的序列的数的个数为4;
那我们如何用代码来完成此个程序呢?
首先,我们分析一下,对于一个数组来说要确定它的某一种属性,要遍历一遍数组对吧,遍历它干嘛呢?首先我们需要确定对于第一次我们已遍历的元素中是否在下一个元素中重复,并且要记录这个已遍历元素的个数(在碰见相同元素前),所以我们定义一个MaxLength来记录给元素的个数;然后我们回到第一个问题,我们如何判断或者说怎么能知道该元素已在之前出现过,再遍历一遍之前的元素?太过于麻烦了,不如设置一个数组RD令其下标等于数列中元素的值,当出现一个元素时,使数组RD中的该值的下标的值加1;这样就可以确定在下一次出现重读元素时,可以判断该元素是否重复(判断条件RD[p[i]>1);方法思路大概就是这样,然后我们来看代码
#include <iostream>
using namespace std;
const int N=1e5+2;
int p[N],RD[N];
int n,ML
//注意;p[]数组是来记录一知数列的,RD[]是记录元素出现个数的;
//ML:是记录最大长度的;
int maxnum(int x,int y)
{
if x>y return x;
else return y;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>p[i];
for(int i=0,j=0;i<n;i++)//此中i是来管数列中的元素的遍历的,而j是用来确定ML长度
{
RD[p[i]]++; //和重复元素的位置的;
while(RD[p[i]]>1) RD[p[j++]]--;//为什么要j++,目的是让j抵达重复元素的位置
ML=maxnum(ML,i-j+1);//i-j+1是在遍历过程中没有碰见重复元素的长度,用ML来记录
//保存该遍历过程中最长的元素个数;
}
printf("%d",ML);
reyturn 0;
}