算法设计与优化策略——滑动窗口

“滑动窗口”和上篇博客中介绍的“等价转换”一样也为一种算法优化的思想。同样,下面通过一个例子,来介绍这种思想。
唯一的雪花(Unique snowflake,UVa 11572)
输入一个长度为n(n<=10^6)的序列A,找到一个尽量长的连续子序列AL~AR,使得该序列中没有相同的元素。
在读完题目以后,我们不难有思路。最简单的思路就是,我们可以通过循环的方法,对每一个元素都找出一它为开头的最长序列(没有相同元素)。这个方法也能做出来,但似乎有点太麻烦了。下面,我们就通过“滑动窗口”的思想来介绍这道题目的另一个思路。
【分析】
假设序列元素从0开始编号,所求连续子序列的左端点为L,又短点为R。首先,先考虑L=0的情况。可以从R=0不断增加R,相当于,把所求序列的右端点往右延伸。当R不能往右继续延伸时(即出现相同的元素时),只需将L不断增加至没有相同的元素时为止。然后再不断增加R,重复此步骤。
【代码】通过代码来实现上述过程,加深理解

#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
const int maxn=1000000+5;
int A[maxn];
int main()
{
        int T,n;
        scanf("%d",&T);
        while(T--){
                scanf("%d",&n);
                for(int i=0;i<n;i++) scanf("%d",&A[i]);
                set<int> s;
                int L=0,R=0,ans=0;
                while(R<n){
                        while(R<n&&!s.count(A[R])) s.insert(A[R++]);
                        ans=max(ans,R-L);
                        s.erase(A[L++]);
                        }
                        printf("%d\n",ans);
                }
                return 0;
    }

同时,此题用C++的STL中的set,实现了这一过程。

原文地址:http://blog.51cto.com/13642075/2088761

时间: 2024-10-22 18:26:37

算法设计与优化策略——滑动窗口的相关文章

uva 1608 不无聊的序列(附带常用算法设计和优化策略总结)

uva 1608 不无聊的序列(附带常用算法设计和优化策略总结) 紫书上有这样一道题: 如果一个序列的任意连续子序列中都至少有一个只出现一次的元素,则称这个序列时不无聊的.输入一个n个元素的序列,判断它是不是无聊的序列.n<=200000. 首先,在整个序列中找到只出现一次的元素ai.如果不能找到,那它就是无聊的.不然,就可以退出当前循环,递归判断[1, i-1]和[i+1, n]是不是无聊的序列.然而怎么找ai很重要.如果从一头开始找,那么最差情况下的时间复杂度就是O(n^2)的.而如果从两头

常用算法设计和优化策略(本蒟蒻不定期更新)

常用算法设计和优化策略(本蒟蒻不定期更新) 下面是紫书上讲的常用算法设计策略和优化策略: 分治法:将问题分成相同的独立子问题求解.拆分出的问题必须有最优子结构性质(子问题求出的是最优解) 动态规划.本质是:对于一个问题,通过划分阶段,定义状态与状态间的关系,来分解问题.利用单阶段问题之间的联系,或者同一阶段状态之间的联系,一个一个阶段往下决策,最终解决问题. 拆分出的问题必须满足最优子结构性质和无后效性(当前阶段以前的状态不会影响以后的状态,只与当前阶段有关).动归的目的是避免重叠子问题.递推和

《算法竞赛入门经典》之“算法设计与优化策略”

一.构造法 UVA 120 Stacks of Flapjacks Time Limit: 3000MS     64bit IO Format: %lld & %llu Submit Status uDebug Description Background Stacks and Queues are often considered the bread and butter of data structures and find use in architecture, parsing, op

OPENCV学习笔记15_算法设计中使用策略模式

Building a bug-free(无BUG) application is just the beginning. What you really want is an application that you and the programmers working with you(团队) will be able to easily adapt and evolve (修改和升级)as new requirements come in(随着新的需求进入,面临新的需求). Basical

#(单调队列优化)P1886 滑动窗口(普及+/提高-)

https://www.jianshu.com/p/0bf8d8f1e450 https://blog.csdn.net/qq_42754826/article/details/89052630 #include<cstdio>#define N 1000020using namespace std;int n,k;int a[N];struct monotone_queue{ int q[N],p[N]; int head,tail; }minq,maxq;void min_query(){

基于滑动窗口的免锁队列设计实现

消息队列是一些平台的通信的基石,各个任务的通信基于消息队列,消息队列的处理速度往往影响整个系统的性能,为了避免多任务同时处理消息队列,通常有任务处理队列时需要加锁来互斥访问. 1:假设每个模块有自己的消息队列,任何模块都可以给这个模块发消息,但只有本模块会从消息队列中取消息处理,如下图所示一个消息队列可能多个任务同时写,一个任务读. 2:为了避免多个任务处理时使用锁导致的效率底线我们可以使用免锁设计来实现队列操作,见http://www.cnblogs.com/chencheng/p/35276

公交车路线查询系统后台数据库设计--换乘算法改进与优化

在<查询算法>一文中已经实现了换乘算法,但是,使用存储过程InquiryT2查询从“东圃镇”到“车陂路口”的乘车路线时,发现居然用了5分钟才查找出结果,这样的效率显然不适合实际应用.因此,有必要对原有的换乘算法进行优化和改进.在本文中,将给出一种改进的换乘算法,相比原有的算法,改进后的算法功能更强,效率更优. 1. “压缩”RouteT0 假设RouteT0有以下几行 如下图所示,当查询S1到S4的二次换乘路线时,将会产生3×2×4=24个结果 从图中可以看出,第1段路线中的3条线路的起点和站

TCP数据量--滑动窗口、拥塞窗口、慢启动、Negle算法 经受时延的确认等

TCP的数据流大致可以分为两类,交互数据流与成块的数据流.交互数据流就是发送控制命令的数据流,比如relogin,telnet,ftp命令等等:成块数据流是用来发送数据的包,网络上大部分的TCP包都是这种包. 很明显,TCP在传输这两种类型的包时的效率是不一样的,因此为了提高TCP的传输效率,应该对这两种类型的包采用不同的算法. 总之,TCP的传输原则是尽量减少小分组传输的数量. TCP的交互式数据流 ?         经受时延的确认技术 TCP的交互式数据流通常使用"经过时延的确认"

算法题解之滑动窗口

Substring with Concatenation of All Words 寻找所有词连接的子串 思路:由于该字串是所有词典中的词连接的,所以该字串长度固定.因此本题可以看作一个滑动窗口的题.为了去除重复工作,每次滑动一个单词的长度,因此起始位置就有n种(n为单词长度).每种起始位置的滑动策略如下: 如果当前窗口满足条件,则窗口只往后移动一个单词,并且下一次只检查最后一个单词(中间的单词肯定满足条件).    如果当前窗口不满足条件,则有两种情况: 1.当前窗口内不满足条件的第一个单词不