UVA 11572 唯一的雪花(滑动窗口)

可以用set或者map来实现

1.用set,把每个唯一元素进入集合,扩展右边界,直到发现有不唯一的元素,从左边开始删除元素,直到集合中无该元素

#include<bits/stdc++.h>

using namespace std;
int a[1000000];
set<int> s;

int main(){
	int n;
	scanf("%d",&n);

	while(n--){
		int count;
	
		scanf("%d",&count);
		for(int i=0;i<count;i++)
		scanf("%d",&a[i]);
		
		int r=0,l=0,ans=0;
		s.clear();
		set<int>::iterator it=s.begin();
		while(r<count){
			while(r<count && s.find(a[r])==s.end())
			s.insert(a[r++]);
			
			ans=max(ans,r-l);
			s.erase(a[l++]);			
		}		
		printf("%d\n",ans);	
	}	
	
}

2.用map实现:

用map记录每个数对应的数组下标,用last[i]记录数组下标为i时,之前有没有和他一样的元素,若有,则使last[i]等于那个元素的下标,若没有,使last[i]=-1,以便后续移动左边界。

#include<bits/stdc++.h>

using namespace std;
int last[1000005];
map<int,int> cur;
int a[1000005];
int main(){
	int n;
	scanf("%d",&n);
	int count;
	while(n--){
		cur.clear();
	
		scanf("%d",&count);
		for(int i=0;i<count;i++){
		scanf("%d",&a[i]);
		if(cur.find(a[i])==cur.end())        //如果没找到 
		last[i]=-1;
		else                                //如果找到了 
		last[i]=cur[a[i]];
		
		cur[a[i]]=i;

	}		


		int l=0,r=0,ans=0;	
		while(r<count){
			while(r<count && last[r]<l) r++;
			ans=max(ans,r-l);
			l++;
		}
		
		printf("%d\n",ans);
}
}
发布了57 篇原创文章 · 获赞 58 · 访问量 634

猜你喜欢

转载自blog.csdn.net/weixin_43568895/article/details/103678692