滑动窗口算法详解
2024年1月1日
本文详细介绍滑动窗口算法的原理及实现方法。
1. 滑动窗口基本概念
滑动窗口是一种常见的双指针技术,维护一个左闭右开的区间,时间复杂度为O(n)。
2. 滑动窗口算法框架
2.1 基本实现
/* 滑动窗口算法框架 */
func slidingWindow(s string) {
// 用合适的数据结构记录窗口中的数据,根据具体场景变通
// 比如说,我想记录窗口中元素出现的次数,就用 map
// 我想记录窗口中的元素和,就用 int
window := make(map[rune]int)
left, right := 0, 0
for right < len(s) {
// c 是将移入窗口的字符
var c rune = rune(s[right])
window[c]++
// 增大窗口
right++
// 进行窗口内数据的一系列更新
// ...
// 去掉调试信息
// 你的代码中不应该有打印,因为它可能会阻止你的解决方案通过
// fmt.Printf("window: [%d, %d)\n", left, right)
// 判断左侧窗口是否要收缩
for ; left < right; {
// 增加一个判断条件来计算哪种情况会使窗口需要缩小
// if window needs shrink {
// d 是将移出窗口的字符
var d rune = rune(s[left])
window[d]--
// 缩小窗口
left++
// 进行窗口内数据的一系列更新
// ...
// }
}
}
}