首页 > 极客资料 博客日记
滑动窗口问题总结
2024-09-23 17:30:05极客资料围观18次
文章滑动窗口问题总结分享给大家,欢迎收藏极客之家,专注分享技术知识
适用范围
1、一般是字符串或者列表
2、一般是要求最值(最大长度,最短长度等等)或者子序列
算法思想
1、在序列中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个窗口。
2、先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的序列符合要求。
3、此时,停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的序列不再符合要求。同时,每次增加 left前,都要更新一轮结果。
4、重复第 2 和第 3 步,直到 right 到达序列的尽头。
思路其实很简单:第 2 步相当于在寻找一个可行解,然后第 3 步在优化这个可行解,最终找到最优解。左右指针轮流前进,窗口大小增增减减,窗口不断向右滑动。
Note: 因为每次right找到新的字符串后会向后移动,指向的是下一个待判断的字符,所以,如果是判断字符串的长度应该是用right-left
,而不是right-left+1
代码模板
func slidingWindowTemplate(s string) int {
left, right := 0, 0 // 初始化窗口的左右边界
result := 0 // 用于存储结果
window := make(map[byte]int) // 记录窗口中元素的频率,或其他窗口状态
// 遍历数组或字符串
for right < len(s) {
// 1. 扩展窗口,更新窗口状态
charRight := s[right]
window[charRight]++ // 将字符加入窗口
right++
// 2. 如果窗口不满足条件,收缩窗口
for /* 条件: 窗口不满足要求 */ {
charLeft := s[left]
window[charLeft]-- // 将左边的字符移出窗口
left++
}
// 3. 更新结果
result = max(result, right - left) // 例如,记录窗口的最大长度
}
// 4. 返回最终结果
return result
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”