当前位置: 首页 > 科技观察

Leetcode精要算法:说说滑动窗口_0

时间:2023-03-11 23:22:52 科技观察

前言我们在刷Leetcode的时候,经常会遇到滑动窗口类型的问题。滑动窗口问题很经典也很有技术含量,一般大厂都喜欢问。今天就和大家一起学习滑动窗口的套路。如果文章中有不对的地方,欢迎大家指出。谢谢~什么是滑动窗口?一个算法问题进入滑动窗口滑动窗口可以用来解决什么问题?滑动窗口框架套路Leetcode案例分析什么是滑动窗口滑动窗口这个词,相信大家都不陌生。因为说到TCP,我们经常会说到滑动窗口协议(SlidingWindowProtocol),它是TCP协议的一种应用,用于网络数据传输过程中的流量控制,避免拥塞。TCP头中有一个字段叫做win,即16位的窗口大小,告诉对方本地TCP接收缓冲区可以容纳多少字节的数据,以便对方控制发送的速度数据,从而达到流量控制的目的。TCP的滑动窗口是在某一时刻窗口大小固定的滑动窗口,窗口大小也会随着网络流量变化等因素发生变化。算法中的滑动窗口有点类似,就是维护一个窗口(队列/数组),一直滑动,然后更新答案。滑动窗口就是指这类问题的求解方法,它是通过在数组上同向移动两个指针来求解的一类问题。滑动窗口算法的一个例子让我们看一个算法问题:给定一个整数数组,计算长度为k的连续子数组的最大和。输入:arr[]={100,200,300,400}k=2输出:700解释:300+400=700看到这个问题,我们马上想到了暴力的方法来解决,两个forgetit:publicintmaxSum(int[]arry,intk){intsize=arry.length;intmaxSum=0;for(inti=0;iwindows=newHashSet<>();intleft=0,right=0;intres=0;while(rightlookup=newHashMap<>();for(inti=0;i0)tCount--;lookup.put(c,lookup.get(c)-1);//windowright++;//所有已经包含T的字母while(tCount==0){//比较并更新答案if(minLen>right-left){minLen=right-left;result=s.substring(left,right);}charc2=s.charAt(left);if(lookup.get(c2)==0)tCount++;lookup.put(c2,lookup.get(c2)+1);//窗口缩小自leftleft++;}}returnresult;}}leetcode提交结果如下: