(一)介绍

滑动窗口法,也叫尺取法(可能也不一定相等,大概就是这样 ),可以用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。

由于区间连续,因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。往往类似于“请找到满足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
    }

 

Logo

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

更多推荐