POJ-3320 Jessica's Reading Problem(尺取法)
2016-01-02 17:01
323 查看
题意:给你n个数字。数字可能有重复,求连续的能包含所有不重复的数的最短长度。
思路:尺取法的思路很好想到。。。具体做法是先求出不同数的数量k。然后开始增长,当刚好等于这个数量k后。再减,直到等于k-1。然后再加。。直到结束。
自己碰到的问题。求数量用set可以。然后“当刚好等于这个数量k后。再减,直到等于k-1”这里我卡主。因为set不去重。所以直接earse不可取。queue的话无法保证不重复的数量的求法。map也不知道怎么做。看了题解豁然开朗。。。。
map<int,int>存的是当前的数出现的次数。。。。。
思路:尺取法的思路很好想到。。。具体做法是先求出不同数的数量k。然后开始增长,当刚好等于这个数量k后。再减,直到等于k-1。然后再加。。直到结束。
自己碰到的问题。求数量用set可以。然后“当刚好等于这个数量k后。再减,直到等于k-1”这里我卡主。因为set不去重。所以直接earse不可取。queue的话无法保证不重复的数量的求法。map也不知道怎么做。看了题解豁然开朗。。。。
map<int,int>存的是当前的数出现的次数。。。。。
const int maxn=1001000; int a[maxn]; int main() { int p; scanf("%d",&p); set<int> s; for(int i=1;i<=p;i++) { scanf("%d",&a[i]); s.insert(a[i]); } int num_s=s.size(); map<int,int> Count; Count.clear(); int res=p+1; int f=1,e=1,len=0; for(;;) { while(e<=p&&len<num_s) { if(Count[a[e++]]++==0) len++; } if(len<num_s) break; res=min(res,e-f); if(--Count[a[f++]]==0) len--; } printf("%d\n",res); return 0; }
相关文章推荐
- MySQL ERROR 1698 (28000) 错误
- 策略模式
- anaconda:kickstart定制自动化安装镜像
- Java基础之break和continue
- HttpClient3.x文件上传
- 文件上传的基础知识
- Devu, the Singer and Churu, the Joker
- Jersey框架一:Jersey RESTful WebService框架简介
- android手机连接问题adb not responding& compatible=NO, minSdk(API 9) > deviceSdk(API 1)}
- PIC32MZ tutorial -- Watchdog Timer
- String类之endsWith方法--->检测该字符串以xx为结尾
- LeetCode 171:Excel Sheet Column Numbert
- 重码 ctype
- 边学边用OpenGL-开篇语
- Palindrome Numbers(LA2889)第n个回文数是?
- MySql循环插入数据(定义了存储过程)
- Android 相机 II-实现自己的相机APP
- Debug命令详解
- mysql 定义function rand
- HDU 1036 Average is not Fast Enough!【水】