数据结构与算法 之 滑动窗口
(一)介绍滑动窗口法,也叫尺取法(可能也不一定相等,大概就是这样 ),可以用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。由于区间连续,因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。往往类似于“请找到满足xx的最x的区间(子串、子数组)的xx”这类问题都可以使用该方法进行解决(二)目的减少 while 循环(三)主要思路滑动窗
·
(一)介绍
滑动窗口法,也叫尺取法(可能也不一定相等,大概就是这样 ),可以用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。
由于区间连续,因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。往往类似于“请找到满足xx的最x的区间(子串、子数组)的xx”这类问题都可以使用该方法进行解决
(二)目的
减少 while 循环
(三)主要思路
滑动窗口特点:找不同
例如:与上一次相比,本次删除了第一个元素,向后添加了一个元素
删除数组第一项:shift
向后增加一项:push
参考文章:https://zhuanlan.zhihu.com/p/61564531
var maxSlidingWindow = function(nums, k) {
if (nums.length === 0) {
return []
}
var result = []
var targetMaxArr = nums.slice(0, k)
var rightIndex = k - 1
while (rightIndex <= nums.length - 1) {
result.push(Math.max(...targetMaxArr))
rightIndex++
targetMaxArr.push(nums[rightIndex])
targetMaxArr.shift()
}
return result
}
核心:维护一个滑动窗口,右侧负责扩张该窗口的大小 左侧负责缩小该窗口的大小。左侧、右侧只能向右移动 不能再往回返
var lengthOfLongestSubstring = function(s) {
if (s.length === 0) {
return 0
}
var map = new Map()
var leftPoint = 0
var rightPoint = 0
var maxResult = 0
while (rightPoint < s.length) {
var pos = map.get(s[rightPoint])
// 存在 并且在当前区间内 不能再跳出去了
if (pos >= leftPoint && pos <= rightPoint) {
// 窗口左边界变为出现的下一个位置
leftPoint = pos + 1
}
map.set(s[rightPoint], rightPoint)
// 移动一次就算一下
maxResult = Math.max(maxResult, rightPoint - leftPoint + 1)
rightPoint++
}
return maxResult
}

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)