窗口滑动算法
简介
滑动窗口算法思想是非常重要的一种思想,可以用来解决数组,字符串的子元素问题。它可以将嵌套循环的问题,转换为单层循环问题,降低时间复杂度,提高效率。
滑动窗口的思想非常简单,它将子数组(子字符串)理解成一个滑动的窗口,然后将这个窗口在数组上滑动,在窗口滑动的过程中,左边会出一个元素,右边会进一个元素,然后只需要计算当前窗口内的元素值即可。
可用滑动窗口思想解决的问题,一般有如下特点:
-
窗口内元素是连续的。就是说,抽象出来的这个可滑动的窗口,在原数组或字符串上是连续的。
-
窗口只能由左向右滑动,不能逆过来滑动。就是说,窗口的左右边界,只能从左到右增加,不能减少,即使局部也不可以。
算法思想
1.定义两个变量:right和right,用来表示两个边界。[left,right]表示窗口
2.首先right边界先扩张,到达指定的位置(根据题目来定),然后left开始扩张,直到指定的位置(依据题目来定)
3.重复上述步骤,直到right走到数组或者字符串的尾部为止
算法实现
left,right := 0,0 // 左右指针
// 窗口右边界滑动
for right < length {
window.add(s[right]) // 右元素进窗
right++ // 右指针增加
// 窗口满足条件
for valid(window) && left<right {
... // 满足条件后的操作
window.remove(arr[left]) // 左元素出窗
left++

滑动窗口算法是一种重要的思想,常用于解决数组和字符串的子元素问题,将嵌套循环转化为单层循环,提高效率。算法包括定义左右边界、右边界扩张、左边界扩张等步骤,并适用于具有单调性的题目。文中通过无重复字符最长子串和求最大子数组和的案例进行阐述。
最低0.47元/天 解锁文章
4664

被折叠的 条评论
为什么被折叠?



