Skip to content

滑动窗口刷题模板

以下例子,用于获取数组中满足队列只和大于目标数字的长度最小的子数组

关键在于「快指针」和「慢指针」,嵌套 2 个 while,快指针不停地向终点移动,一旦满足要求,则进入内部循环开始移动慢指针。

js
const minSubArrayLen = function (target, nums) {
  let result = Infinity
  let sum = 0
  let slow = 0,
    fast = 0
  while (fast < nums.length) {
    sum += nums[fast]
    while (sum >= target) {
      // 记录,注意计算数组长度需要索引差值+1
      result = Math.min(result, fast - slow + 1)
      // 减去左边值,收缩范围
      sum -= nums[slow]
      slow++
    }
    fast++
  }
  return result === Infinity ? 0 : result
}
const minSubArrayLen = function (target, nums) {
  let result = Infinity
  let sum = 0
  let slow = 0,
    fast = 0
  while (fast < nums.length) {
    sum += nums[fast]
    while (sum >= target) {
      // 记录,注意计算数组长度需要索引差值+1
      result = Math.min(result, fast - slow + 1)
      // 减去左边值,收缩范围
      sum -= nums[slow]
      slow++
    }
    fast++
  }
  return result === Infinity ? 0 : result
}
js
// 求不重复的最长子字符串
var lengthOfLongestSubstring = function (s) {
  let i = 0
  let ans = 0
  let arr = s.split('')
  let tmpl = []
  while (i < arr.length) {
    let nextChar = arr[i]
    // 如果下一个字符和已有的重复了,收缩左边界到不重复为止
    while (tmpl.includes(nextChar)) {
      tmpl.shift()
    }
    // 字符串进队列
    tmpl.push(nextChar)
    // 记录长度
    ans = Math.max(ans, tmpl.length)
    // 继续扩充右边界
    i++
  }
  return ans
}
// 求不重复的最长子字符串
var lengthOfLongestSubstring = function (s) {
  let i = 0
  let ans = 0
  let arr = s.split('')
  let tmpl = []
  while (i < arr.length) {
    let nextChar = arr[i]
    // 如果下一个字符和已有的重复了,收缩左边界到不重复为止
    while (tmpl.includes(nextChar)) {
      tmpl.shift()
    }
    // 字符串进队列
    tmpl.push(nextChar)
    // 记录长度
    ans = Math.max(ans, tmpl.length)
    // 继续扩充右边界
    i++
  }
  return ans
}