JavaScript滑动窗口算法

  • 1 思想
  • 2 代码

1 思想

在力扣上刷题时经常可以看到这样的题,求XXX的子串、子数组、子序列等等,这类题一般使用滑动窗口来解决。本篇文章的思路学习了bilibili的up主红桃A士。

情况一:寻找最长的

①初始化左右指针left和right,左右指针之间的内容就是窗口,定义一个变量result记录当前的滑动窗口的结果,定义一个变量bestResult记录当前滑动窗口下的最优结果
②right要向右逐位滑动循环
③每次滑动后,记录当前滑动的结果。如果当前的结果符合条件,则更新最优的结果,然后right要继续向右滑动;如果当前的结果不符合条件,那么要让left逐步收缩
④当right到达结尾时停止滑动

初始化left,right,result,bestResult
while (右指针没有到结尾) {窗口扩大,加入right对应元素,更新当前resultwhile (result不满足要求) {窗口缩小,移除left对应元素,left右移}更新最优结果bestResultright++;
}
返回bestResult

情况二:寻找最短的

①初始化左右指针left和right,左右指针之间的内容就是窗口,定义一个变量result记录当前的滑动窗口的结果,定义一个变量bestResult记录当前滑动窗口下的最优结果
②right要向右逐位滑动循环
③每次滑动后,记录当前滑动的结果。如果当前的结果符合条件,则更新最优的结果,然后right要继续向右滑动;如果当前的结果不符合条件,那么要让left逐步收缩
④当right到达结尾时停止滑动

初始化left,right,result,bestResult
while (右指针没有到结尾) {窗口扩大,加入right对应元素,更新当前resultwhile (result不满足要求) {更新最优结果bestResult窗口缩小,移除left对应元素,left右移}right++;
}
返回bestResult

2 代码

下面以力扣的两道题来说明两种情况。

1、寻找最长的

力扣3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。

var lengthOfLongestSubstring = function (s) {let left = right = len = maxLen = 0;let arr = []; // 记录当前滑动窗口包含的字符// 当右指针指向字符串最右边时停止循环while (right < s.length) {if (arr.includes(s[right])) { // 如果滑动窗口中的字符串包含了右指针指向的元素// 当arr中不包含右指针指向的字符,停止循环while (arr.includes(s[right])) {arr.shift(); // 删除最左边的元素len--; // 更新当前的长度left++; // 左指针右移}// 循环结束后,arr中不包含右指针指向的元素arr.push(s[right]);len++;right++;} else { // 如果滑动窗口中的字符串不包含右指针指向的元素arr.push(s[right]);len++; // 更新当前状态if (len > maxLen) { // 如果当前长度大于记录的最大长度,则更新最大长度maxLen = len;}right++;}}return maxLen;
};

2、寻找最短的

力扣209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:
输入:target = 4, nums = [1,4,4]
输出:1

示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

var minSubArrayLen = function (target, nums) {let left = 0, right = 0; // 定义左右指针let result = 0; // 记录当前滑动窗口的值let bestResult = 0; // 记录最优的值while (right < nums.length) { // 右指针移动到最右边《结束循环result = result + nums[right]; // 记录当期滑动窗口的值while (result >= target) {// 如果当前的最好的结果大于左右指针之间的长度,更新最优结果if (right - left + 1 < bestResult || bestResult == 0) {bestResult = right - left + 1;}// 将左指针向右移,并且左指针的值从当前结果里面减掉result -= nums[left];left++;}right++; // 向右滑动窗口}return bestResult;
};

JavaScript滑动窗口算法相关推荐

  1. 列表左右箭头滑动_我写了一套框架,把滑动窗口算法变成了默写题

    读完本文,你可以去力扣拿下如下题目: 76.最小覆盖子串 567.字符串的排列 438.找到字符串中所有字母异位词 3.无重复字符的最长子串 ----------- 鉴于前文 二分搜索框架详解 的那首 ...

  2. 滑动窗口算法_有点难度,几道和「滑动窗口」有关的算法面试题

    前言科普:什么是滑动窗口算法 滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合. 假设有数组 [a b c d e f g h ],一个大小为 3 的 **滑动窗 ...

  3. 从零开始学习VIO笔记 --- 第四讲:滑动窗口(基于滑动窗口算法的 VIO 系统:可观性和一致性)

    从零开始学习VIO笔记 --- 第四讲:滑动窗口(基于滑动窗口算法的 VIO 系统:可观性和一致性) 一. 从高斯分布到信息矩阵 1.1 高斯分布 1.2 高斯分布和协方差矩阵 1.3 信息矩阵 二. ...

  4. 滑动窗口算法通用思想

    文章目录 一.最小覆盖子串 二.找到字符串中所有字母异位词 三.无重复字符的最长子串 最后总结 本文详解「滑动窗口」这种高级双指针技巧的算法框架,带你秒杀几道难度较大的子字符串匹配问题: 最小覆盖子串 ...

  5. c语言怎么实现滑动窗口算法,【C语言】滑动窗口算法

    1.滑动窗口的思想: 它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合.假设有数组 [a b c d e f g h ],一个大小为 3 的 滑动窗口 在其上滑动,则有: [a b c] ...

  6. sentinel 时间窗口_Sentinel滑动窗口算法

    在前面搞清楚了Sentinel的使用后,大致理了一下Sentinel的责任链,搞清楚了这个,基本就已经梳理清楚sentinel-core模块的大部分内容,顺着这条链路可以继续梳理很多东西. 知其然.知 ...

  7. c语言 滑窗法_滑动窗口算法(一)

    某日事不多,点开sentinel-core代码学习,想看看qps.rt等是怎么统计的. 点开StatisticSlot类,发现里面是用DefaultNode增加qps,然后尝试点开 DefaultNo ...

  8. 滑动窗口算法用法及实题详解

    在力扣常用解题法中,我们常常会看到这些: 滑动窗口 双指针 快慢指针/ 链表题目 原地链表翻转 区间合并 无序限定范围的数组元素查找O(N) BFS 树的DFS DFS/递归/回溯法 双堆模式 2分变 ...

  9. 滑动窗口算法框架(Java版)秒杀力扣题(76、567、438、3、485)

    一.声明 1.非常感谢东哥(labuladong)分享了**滑动窗口算法框架**: 2.我在理解了东哥的思想后,用Java实现了滑动窗口算法框架,一来方便自己学习,二来方便一些Java小伙伴: 3.再 ...

最新文章

  1. 12月第1周全球五大顶级域名总量呈负增长 减2.5万个
  2. 初等数论--原根--阶的计算
  3. Codeforces Round #592 (Div. 2) F. Chips 构造 + 细节
  4. Redis运维和开发学习笔记(1) Redis简介
  5. ffmpy3与ffmpeg的简单使用
  6. 又一个被JavaScript攻占的领域:物联网
  7. 携程ELK日志分析平台深耕之路
  8. 将实例的生成交给子类——工厂方法模式
  9. 此 Windows 副本不是正版的解决方案
  10. 如何实现一个 Email HTML 邮件模板
  11. 8 升满壶和两个分别是 5 升、3 升的空壶 如何得到 4 升水?
  12. java 2的64次幂_2的N次方对照表 2的64次方等于几?
  13. MYSQL命令(超详细)
  14. ie浏览器html状态栏隐藏,我的IE浏览器忽然上面的菜单栏及地址栏都不见了
  15. 根域名服务器作用,域名系统的主要功能是什么?域名系统中的本地域名服务器、根域名服务器、顶级域名 - 问答库...
  16. 丝般顺滑!全新垃圾回收器 ZGC 初体验 | 龙蜥技术
  17. 一种很厉害的AI学习方式
  18. 快递到付被拒收怎么办?双方都拒收货物会怎么处理?
  19. Spring三大核心思想
  20. python实现多进程工资计算器

热门文章

  1. scp传文件指定端口
  2. 华为ensp 二层交换机使用vlan实现不同网段互通
  3. 平面设计系列之一--ps
  4. 关于单片机控制用字库显示LCD12864汉字
  5. “华为杯”研究生数学建模竞赛2020年-【华为杯】B题:汽油辛烷值优化建模(附优秀论文)
  6. childNodes和nodeType
  7. Linux实验 | Ubuntu20.04编译内核并添加一个系统调用
  8. UESTC - 1636 梦后楼台高锁,酒醒帘幕低垂(枚举+最小生成树)
  9. 微型计算机最新情况,「简讯」英特尔公布7nm酷睿最新进展;OPPO手环活力版官宣……...
  10. 谈下一代企业和下一代技术