超级经典的题目,扫描区间,滑动窗口

对这题目的最大感受就是,单独看这个题目,其实不难,但是很多我感觉挺难或者没做出来的题目,都是由这些若干个经典的算法组合而成的

滑动窗口便是一个典型的例子!!!!遇到过好几道用到滑动窗口的题目

而本题则赤裸裸的滑动窗口

题意:

输入一个长度为n的序列A,找一个尽可能长的子序列使他们之间无重复元素

思路:

第一步,自己暴力模拟

第二步,找规律,尝试着状态转移

第三步,修正,实现

首先不能重复,那么我们先假设区间[l, r] 无重复元素,那么加入一个元素a[r+1],会出现什么变化呢???

如果原来的区间没有a[r+1]那么新的区间仍然是一个无重复元素的区间,否则的话,移动左边界,一直到使他们没有重复

这题wa了几发,,原因是在循环的时候,边界判断错误

实现的话就用cnt[maxn]来记录区间里面的元素信息,右边界右移cnt[x]++,左边界则是cnt[x]--;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector>
#include<set>
using namespace std;
const int maxn=1e6+5;
int A[maxn];
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,t;
cin>>t;
while(t--){
cin>>n;
int r,l,ans;ans=l=r=0;
for(int i=0;i<n;i++) cin>>A[i];
set<int>s;
while(r<n){
while(r<n&&!s.count(A[r])) s.insert(A[r++]);
ans=max(ans,r-l);
s.erase(A[l++]);
}
cout<<ans<<endl;
}
return 0;
}

最新文章

  1. Ubuntu14.04下jdk的安装
  2. 【POJ】【2096】Collecting Bugs
  3. Spring(3.2.3) - Beans(10): 生命周期
  4. sea.js说明文档
  5. web - float , 浮动
  6. Javascript之pixi框架学习
  7. NOIP2016提高组初赛(2)四、读程序写结果3、求最长回文子序列
  8. 洛谷P1258 小车问题(题解)
  9. Python开发爆破工具
  10. Number of subarrays having sum exactly equal to k(explanation for 437. Path Sum III of leetcode)
  11. digital ocean 内存不足时增加swap文件的方法
  12. P2731 骑马修栅栏 Riding the Fences
  13. 【LFM】隐语义模型
  14. PHP通过__call实现简单的AOP(主事务后的其他操作)比如前置通知,后置通知
  15. python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)
  16. tornado部署
  17. sqlserver,oracle,mysql等的driver驱动,url怎么写
  18. 初步学习pg_control文件之八
  19. android开发中,在java中怎样使用c提供过来char*
  20. api 爬虫 避免相同 input 在信息未更新 情况下 重复请求重复

热门文章

  1. 通过生成HFile导入HBase
  2. canvas 踩坑记录
  3. pycharm内对python文件的模板
  4. 使用VS 2019发布.net core程序并部署到IIS的最新教程
  5. python杂货
  6. go语言从例子开始之Example19.接口
  7. Codeforces 1203F (贪心, DP)
  8. 【转】Java里如何实现线程间通信
  9. vue-router中的router-link的active-class
  10. 程序猿必备的10款web前端动画插件