Bootstrap

【leetcode】滑动窗口算法

学过计算机网络的同学,都知道滑动窗口协议(Sliding Window Protocol),该协议是 TCP协议 的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认。因此该协议可以加速数据的传输,提高网络吞吐量。

滑动窗口算法其实和这个是一样的,只是用的地方场景不一样,可以根据需要调整窗口的大小,有时也可以是固定窗口大小。

抽象之后,我们知道这是一个区间题,求子区间经常使用的方法就是滑动窗口。我在「424. 替换后的最长重复字符」的题解中已经分享了我珍藏的滑动窗口模板,由于模板是通用的,因此我把当时的题解再拿过来分享给大家。

《挑战程序设计竞赛》这本书中把滑动窗口叫做「虫取法」,我觉得非常生动形象。因为滑动窗口的两个指针移动的过程和虫子爬动的过程非常像:前脚不动,把后脚移动过来;后脚不动,把前脚向前移动。

刷题心得

读了题目之后,要反应过来这是求一个最长区间的问题,从而想到滑动窗口。滑动窗口是有模板的,理解之后,形成肌肉记忆,下次直接敲出来。坚持刷每日一题,会发现自己在潜移默化中进步。

基本示例

如下图所示,设定滑动窗口(window)大小为 3,当滑动窗口每次划过数组时,计算当前滑动窗口中元素的和,得到结果 res。

滑动窗口算法基本
可以用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。由于区间连续,因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。往往类似于“ 请找

;