双指针|滑动窗口为何不回退?一文讲请!
一、唯一的雪花题目描述企业家 Emily 有一个很酷的主意把雪花包起来卖。她发明了一台机器这台机器可以捕捉飘落的雪花并把它们一片一片打包进一个包裹里。一旦这个包裹满了它就会被封上送去发售。Emily 的公司的口号是“把独特打包起来”为了实现这一诺言一个包裹里不能有两片一样的雪花。不幸的是这并不容易做到因为实际上通过机器的雪花中有很多是相同的。Emily 想知道这样一个不包含两片一样的雪花的包裹最大能有多大她可以在任何时候启动机器但是一旦机器启动了直到包裹被封上为止所有通过机器的雪花都必须被打包进这个包裹里当然包裹可以在任何时候被封上。输入格式第一行是测试数据组数 T对于每一组数据第一行是通过机器的雪花总数 nn≤106下面 n 行每行一个在 [0,109] 内的整数标记了这片雪花当两片雪花标记相同时这两片雪花是一样的。输出格式对于每一组数据输出最大包裹的大小。显示翻译题意翻译输入输出样例输入 #1复制运行1 5 1 2 3 2 1输出 #1复制运行3解法一暴力枚举-枚举出所有符合要求的子数组1.如何枚举所有的子数组呢两层 for 循环2.如何判断枚举的子数组中所有的元素全都不相同解法二利用单调性使用同向双指针优化1.性质在包里枚举的过程中left和right其实是可以不回退的2.用双关键字哈希表维护窗口的信息undered_map int , int mp;其中第一个int表示区间里面的元素第二个int表示元素出现次数3.步骤1初始化left1right12进窗口让right所指的元素进入窗口mp [ arr [ right ] ] ;3判断窗口是否合法mp [ arr [ right ] ] 1就不合法4出窗口让left所指的元素出窗口mp [ arr [ left ] ] --;5更新结果ret max ( ret , right - left 1 ) ;4.时间复杂度ON#includeiostream #includeunordered_map using namespace std; const int N 1e6 10; int arr[N]; int main() { int t; cin t; while (t--) { int n; cin n; //用哈希表维护所有元素出现的次数 unordered_mapint, intmap; for (int i 1;i n;i) cin arr[i]; int left 1; int right 1; int ret 0; while (right n) { //进窗口 map[arr[right]]; //判断窗口是否合法 while (map[arr[right]] 1) { //出窗口 map[arr[left]]--; left; } //更新结果 ret max(ret, right - left 1); right; } cout ret endl; } return 0; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2415067.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!