kangduu / front-end-camps

Front-end learning, interviews, question banks, algorithm camps.
https://kangduu.github.io/front-end-camps
MIT License
2 stars 0 forks source link

《算法篇》滑动窗口 #21

Open kangduu opened 1 year ago

kangduu commented 1 year ago

滑动窗口是一种常用的算法思想,可以在线性时间复杂度内解决很多字符串和数组相关的问题。其基本思想是维护一个长度为k的窗口,该窗口在字符串或数组上滑动,通过对窗口中的元素进行操作,解决问题。下面我们将介绍滑动窗口的原理和实际应用。

原理

滑动窗口的原理可以归纳为以下步骤:

  1. 初始化窗口,即将窗口的左右边界都设为0,并计算窗口的初始状态;
  2. 移动窗口,即将窗口的右边界不断向右移动,直到达到字符串或数组的末尾;
  3. 计算窗口状态,即对当前窗口中的元素进行计算,得到问题的解;
  4. 移动窗口左边界,即将窗口的左边界向右移动,缩小窗口的大小,直到满足问题的要求;
  5. 重复步骤2-4,直到遍历完整个字符串或数组。

滑动窗口的优点是,可以在O(n)的时间复杂度内解决很多字符串和数组相关的问题,因为每个元素最多被访问两次(一次被右边界访问,一次被左边界访问),所以时间复杂度是线性的。

实际应用

滑动窗口可以用于很多字符串和数组相关的问题,以下是一些常见的应用:

• 求最长子串或子序列:例如,求字符串S中最长的不含重复字符的子串,可以使用一个哈希表记录每个字符出现的位置,然后利用滑动窗口遍历字符串,计算每个子串中不含重复字符的最大长度。

• 求连续子数组的最大或最小值:例如,求数组A中长度为k的连续子数组的最大值,可以使用一个双端队列来维护窗口,队列中存放的是当前窗口中的下标,然后利用滑动窗口遍历数组,不断更新队列,计算每个子数组的最大值。

• 求满足某种条件的子串或子序列的个数:例如,求字符串S中满足条件的子串的个数,可以使用滑动窗口遍历字符串,利用哈希表记录每个字符出现的次数,然后根据条件判断每个子串是否满足要求,计算符合条件的子串的个数。

总之,滑动窗口是一种非常实用的算法思想,可以用于解决很多字符串和数组相关的问题。