uva 11572 - Unique Snowflakes
2016-01-08 16:06
465 查看
题意:给出 n个数,找到尽量长的一个序列,使得该序列中没有重复的元素
思路:对于该类段查找问题可以采用经典的滑动窗口方法,即维护一个窗口,窗口的左右边界用两个变量L,R代表,先增加R直到出现重复数字,再增加L,再增加R,直到R达到n
滑动窗口 求解;
当右端碰到有相同的数的时候,左端向右滑动一位数
sample:
图片来源
一、set 数据结构(将窗口内的数字动态存储在set里,然后进行判重即可,当窗口L增加时,在set中删除该元素即可)代码如下:
二、利用数组pre[i]表示第i个数的最近一个重复数的位置,初始值设为-1,这里需要开一个辅助数组,在扫描过程中维护该数组的数据并生成pre[i]数组,T[i]表示数字i扫描到当前的最大下标,由于本题数字规模较大,难以开下T[]数组,所以我们利用map代替,代码如下:
代码
思路:对于该类段查找问题可以采用经典的滑动窗口方法,即维护一个窗口,窗口的左右边界用两个变量L,R代表,先增加R直到出现重复数字,再增加L,再增加R,直到R达到n
滑动窗口 求解;
当右端碰到有相同的数的时候,左端向右滑动一位数
sample:
图片来源
一、set 数据结构(将窗口内的数字动态存储在set里,然后进行判重即可,当窗口L增加时,在set中删除该元素即可)代码如下:
#include<iostream> #include<algorithm> #include<set> using namespace std; const int maxn=1000000+5; int a[maxn]; int main(){ set<int> s; int cases, n; cin >> cases; while(cases--){ cin >> n; for(int i=0;i<n;i++) cin >> a[i]; s.clear(); int left=0, right=0, ans=0; while(right < n){ while(right < n && !s.count(a[right])) s.insert(a[right++]); ans = max(ans, right-left); s.erase(a[left++]); } cout << ans << endl; } return 0; }
二、利用数组pre[i]表示第i个数的最近一个重复数的位置,初始值设为-1,这里需要开一个辅助数组,在扫描过程中维护该数组的数据并生成pre[i]数组,T[i]表示数字i扫描到当前的最大下标,由于本题数字规模较大,难以开下T[]数组,所以我们利用map代替,代码如下:
数组模拟也可,占坑,,,
代码
相关文章推荐
- UIScrollView页面
- sparksql语法,读parquet,load,save
- UITableView的折叠收缩和QQ好友分组效果
- java中int和integer,String,StringBuffer,StringBuilder的区别
- 视频音量控制器UISlider
- RoboGuice 解析
- iOS开发 UI UICollectionView 瀑布流
- UITableView总结
- crtmpserver 在VS2010下的build
- java生成UUID通用唯一识别码 (Universally Unique Identifier)
- UVa1151 Buy or Build
- IOS开发~UISCrollView与UITableView嵌套使用终极解决方案
- 在UIView页面执行pushViewController操作
- iOS Newbie - Xcode 7 & iOS 9 UITextField & UITextView
- UEditor图片路径-从后台传递参数
- 自定义UISlider的样式和滑块
- 01-08 UICollectionView 例子
- UISlider自定义高度
- UIAlertController中添加DatePicker
- It is indirectly referenced from required class file ... could not find class......