JavaScript滑动窗口算法
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滑动窗口算法相关推荐
- 列表左右箭头滑动_我写了一套框架,把滑动窗口算法变成了默写题
读完本文,你可以去力扣拿下如下题目: 76.最小覆盖子串 567.字符串的排列 438.找到字符串中所有字母异位词 3.无重复字符的最长子串 ----------- 鉴于前文 二分搜索框架详解 的那首 ...
- 滑动窗口算法_有点难度,几道和「滑动窗口」有关的算法面试题
前言科普:什么是滑动窗口算法 滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合. 假设有数组 [a b c d e f g h ],一个大小为 3 的 **滑动窗 ...
- 从零开始学习VIO笔记 --- 第四讲:滑动窗口(基于滑动窗口算法的 VIO 系统:可观性和一致性)
从零开始学习VIO笔记 --- 第四讲:滑动窗口(基于滑动窗口算法的 VIO 系统:可观性和一致性) 一. 从高斯分布到信息矩阵 1.1 高斯分布 1.2 高斯分布和协方差矩阵 1.3 信息矩阵 二. ...
- 滑动窗口算法通用思想
文章目录 一.最小覆盖子串 二.找到字符串中所有字母异位词 三.无重复字符的最长子串 最后总结 本文详解「滑动窗口」这种高级双指针技巧的算法框架,带你秒杀几道难度较大的子字符串匹配问题: 最小覆盖子串 ...
- c语言怎么实现滑动窗口算法,【C语言】滑动窗口算法
1.滑动窗口的思想: 它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合.假设有数组 [a b c d e f g h ],一个大小为 3 的 滑动窗口 在其上滑动,则有: [a b c] ...
- sentinel 时间窗口_Sentinel滑动窗口算法
在前面搞清楚了Sentinel的使用后,大致理了一下Sentinel的责任链,搞清楚了这个,基本就已经梳理清楚sentinel-core模块的大部分内容,顺着这条链路可以继续梳理很多东西. 知其然.知 ...
- c语言 滑窗法_滑动窗口算法(一)
某日事不多,点开sentinel-core代码学习,想看看qps.rt等是怎么统计的. 点开StatisticSlot类,发现里面是用DefaultNode增加qps,然后尝试点开 DefaultNo ...
- 滑动窗口算法用法及实题详解
在力扣常用解题法中,我们常常会看到这些: 滑动窗口 双指针 快慢指针/ 链表题目 原地链表翻转 区间合并 无序限定范围的数组元素查找O(N) BFS 树的DFS DFS/递归/回溯法 双堆模式 2分变 ...
- 滑动窗口算法框架(Java版)秒杀力扣题(76、567、438、3、485)
一.声明 1.非常感谢东哥(labuladong)分享了**滑动窗口算法框架**: 2.我在理解了东哥的思想后,用Java实现了滑动窗口算法框架,一来方便自己学习,二来方便一些Java小伙伴: 3.再 ...
最新文章
- 12月第1周全球五大顶级域名总量呈负增长 减2.5万个
- 初等数论--原根--阶的计算
- Codeforces Round #592 (Div. 2) F. Chips 构造 + 细节
- Redis运维和开发学习笔记(1) Redis简介
- ffmpy3与ffmpeg的简单使用
- 又一个被JavaScript攻占的领域:物联网
- 携程ELK日志分析平台深耕之路
- 将实例的生成交给子类——工厂方法模式
- 此 Windows 副本不是正版的解决方案
- 如何实现一个 Email HTML 邮件模板
- 8 升满壶和两个分别是 5 升、3 升的空壶 如何得到 4 升水?
- java 2的64次幂_2的N次方对照表 2的64次方等于几?
- MYSQL命令(超详细)
- ie浏览器html状态栏隐藏,我的IE浏览器忽然上面的菜单栏及地址栏都不见了
- 根域名服务器作用,域名系统的主要功能是什么?域名系统中的本地域名服务器、根域名服务器、顶级域名 - 问答库...
- 丝般顺滑!全新垃圾回收器 ZGC 初体验 | 龙蜥技术
- 一种很厉害的AI学习方式
- 快递到付被拒收怎么办?双方都拒收货物会怎么处理?
- Spring三大核心思想
- python实现多进程工资计算器
热门文章
- scp传文件指定端口
- 华为ensp 二层交换机使用vlan实现不同网段互通
- 平面设计系列之一--ps
- 关于单片机控制用字库显示LCD12864汉字
- “华为杯”研究生数学建模竞赛2020年-【华为杯】B题:汽油辛烷值优化建模(附优秀论文)
- childNodes和nodeType
- Linux实验 | Ubuntu20.04编译内核并添加一个系统调用
- UESTC - 1636 梦后楼台高锁,酒醒帘幕低垂(枚举+最小生成树)
- 微型计算机最新情况,「简讯」英特尔公布7nm酷睿最新进展;OPPO手环活力版官宣……...
- 谈下一代企业和下一代技术