【JavaScript 算法】滑动窗口:处理子数组问题

news2024/12/23 6:46:17

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 一、算法原理
    • 二、算法实现
      • 示例问题1:最长无重复字符子串
      • 示例问题2:长度最小的子数组
      • 注释说明:
    • 三、应用场景
    • 四、总结

在这里插入图片描述

滑动窗口(Sliding Window)是一种高效解决数组或字符串中子数组(子串)问题的算法技巧。它通过在数组上维护一个窗口(区间),动态地调整窗口的大小和位置,从而高效地解决问题。本文将详细介绍滑动窗口算法的原理、实现及其应用。


一、算法原理

滑动窗口算法通过在数组上维护一个窗口来解决子数组问题。窗口的大小和位置可以动态调整,以满足不同问题的需求。滑动窗口的基本思想是:

  1. 初始化窗口的起始位置和结束位置。
  2. 移动窗口的结束位置,扩展窗口的范围。
  3. 在窗口范围内进行计算,检查是否满足问题的条件。
  4. 如果条件不满足,移动窗口的起始位置,缩小窗口的范围。
  5. 重复步骤2-4,直到遍历完整个数组。

在这里插入图片描述


二、算法实现

示例问题1:最长无重复字符子串

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

/**
 * 找出字符串中最长无重复字符子串的长度
 * @param {string} s - 输入字符串
 * @return {number} - 最长无重复字符子串的长度
 */
function lengthOfLongestSubstring(s) {
  const set = new Set();
  let left = 0;
  let right = 0;
  let maxLength = 0;

  while (right < s.length) {
    if (!set.has(s[right])) {
      set.add(s[right]);
      right++;
      maxLength = Math.max(maxLength, right - left);
    } else {
      set.delete(s[left]);
      left++;
    }
  }

  return maxLength;
}

// 示例
const s = "abcabcbb";
console.log(lengthOfLongestSubstring(s)); // 输出: 3

示例问题2:长度最小的子数组

给定一个含有正整数的数组和一个正整数 target,找出该数组中满足其和大于等于 target 的长度最小的子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

/**
 * 找出和大于等于 target 的长度最小的子数组的长度
 * @param {number} target - 目标和
 * @param {number[]} nums - 输入数组
 * @return {number} - 长度最小的子数组的长度
 */
function minSubArrayLen(target, nums) {
  let left = 0;
  let right = 0;
  let sum = 0;
  let minLength = Infinity;

  while (right < nums.length) {
    sum += nums[right];
    right++;

    while (sum >= target) {
      minLength = Math.min(minLength, right - left);
      sum -= nums[left];
      left++;
    }
  }

  return minLength === Infinity ? 0 : minLength;
}

// 示例
const target = 7;
const nums = [2, 3, 1, 2, 4, 3];
console.log(minSubArrayLen(target, nums)); // 输出: 2

注释说明:

  1. 最长无重复字符子串

    • set:用于存储窗口内的字符,避免重复。
    • leftright:分别表示窗口的起始位置和结束位置。
    • maxLength:用于记录最长无重复字符子串的长度。
    • while (right < s.length):遍历字符串。
    • if (!set.has(s[right])):如果字符不在集合中,加入集合并更新窗口大小和最长长度。
    • else:如果字符在集合中,删除起始位置的字符并移动起始位置。
  2. 长度最小的子数组

    • leftright:分别表示窗口的起始位置和结束位置。
    • sum:用于记录窗口内的子数组和。
    • minLength:用于记录满足条件的最小子数组长度。
    • while (right < nums.length):遍历数组。
    • while (sum >= target):如果子数组和大于等于目标值,更新最小长度,并缩小窗口范围。

三、应用场景

  1. 字符串处理:如查找最长无重复字符子串、包含所有字符的最小子串等。
  2. 数组处理:如查找和大于等于目标值的最小子数组、固定大小的最大或最小子数组和等。
  3. 数据流处理:滑动窗口算法可以用于实时处理数据流,计算动态窗口内的数据特征。

四、总结

滑动窗口算法是一种高效解决数组或字符串中子数组(子串)问题的算法技巧,通过动态调整窗口的大小和位置,可以在O(n)时间复杂度内解决许多实际问题。理解和掌握滑动窗口算法,可以有效解决字符串处理、数组处理和数据流处理等问题。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java多线程-----线程安全问题(详解)

目录 &#x1f347;一.线程安全问题的引入&#xff1a; &#x1f352;二.线程安全问题产生的原因&#xff1a; &#x1f34c;三.如何解决线程安全问题&#xff1a; &#x1f389;1.synchronized关键字: &#x1f989;sychronized关键字的特性: ✨2.volatile关键字: &#…

03 Git的基本使用

第3章&#xff1a;Git的基本使用 一、创建版本仓库 一&#xff09;TortoiseGit ​ 选择项目地址&#xff0c;右键&#xff0c;创建版本库 ​ 初始化git init版本库 ​ 查看是否生成.git文件&#xff08;隐藏文件&#xff09; 二&#xff09;Git ​ 选择项目地址&#xff0c…

数据隔离级别查询一致导致重复退款

Transactionalpublic void updateAfsState() {String no "500001880002";OrderReturn orderReturnDb orderReturnModel.getOrderReturnByAfsSn(no);log.info("1.该售后单状态&#xff1a;{}" , orderReturnDb.getState());if(orderReturnDb.getState().e…

【人工智能】机器学习 -- 贝叶斯分类器

目录 一、使用Python开发工具&#xff0c;运行对iris数据进行分类的例子程序NaiveBayes.py&#xff0c;熟悉sklearn机器实习开源库。 1. NaiveBayes.py 2. 运行结果 二、登录https://archive-beta.ics.uci.edu/ 三、使用sklearn机器学习开源库&#xff0c;使用贝叶斯分类器…

vue使用了代理跨域,部署上线,使用Nginx配置出现问题,访问不到后端接口

1、如果路由的mode是history模式的要加上框框里的哪句&#xff0c;然后配置下面的location router location / {root /usr/local/app/dist/; #vue文件dist的完整路径try_files $uri $uri/ router;index index.html index.htm;}#error_page 500 502 503 504 /50x.html;lo…

缓存弊处的体验:异常

缓存&#xff08;cache&#xff09;&#xff0c;它是什么东西&#xff0c;有神马用&#xff0c;在学习内存的时候理解它作为一个存储器&#xff0c;来对接cpu和内存&#xff0c;来调节cpu与内存的速度不匹配的问题。 缓存&#xff0c;一个偶尔可以听到的专业名词&#xff0c;全…

深入理解FFmpeg--软/硬件解码流程

FFmpeg是一款强大的多媒体处理工具&#xff0c;支持软件和硬件解码。软件解码利用CPU执行解码过程&#xff0c;适用于各种平台&#xff0c;但可能对性能要求较高。硬件解码则利用GPU或其他专用硬件加速解码&#xff0c;能显著降低CPU负载&#xff0c;提升解码效率和能效。FFmpe…

Leetcode双指针法应用

1.双指针法 文章目录 1.双指针法1.1什么是双指针法&#xff1f;1.2解题思路1.3扩展 1.1什么是双指针法&#xff1f; 双指针算法是一种在数组或序列上操作的技巧&#xff0c;实际上是对暴力枚举算法的一种优化&#xff0c;通常涉及到两个索引&#xff08;或指针&#xff09;从两…

ubuntu 安装图形化界面

前言&#xff1a; 如果在首次安装操作系统的时候是最小化安装&#xff0c;可以参照本文进行安装 安装图形化界面软件包 下载源最好提前换成国内源 sudo apt-get install ubuntu-desktop设置图形化启动 sudo systemctl set-default graphical.target重启系统 reboot验证&…

《Techporters架构搭建》-Day02 集成Mybatis-plus

集成Mybatis-plus Mybatis-plus集成Mybatis-plus步骤小结 Mybatis-plus Mybatis-plus官网 MyBatisPlus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。它引入了一些新的特性&…

免费的数字孪生平台助力产业创新,让新质生产力概念有据可依

关于新质生产力的概念&#xff0c;在如今传统企业现代化发展中被反复提及。 那到底什么是新质生产力&#xff1f;它与哪些行业存在联系&#xff0c;我们又该使用什么工具来加快新质生产力的发展呢&#xff1f;今天我将介绍一款为发展新质生产力而量身定做的数字孪生工具。 新…

java学校--Object类方法--toString

第一点解析&#xff1a; 全类名就是包名加类名 getClass&#xff08;&#xff09;.getName()是得到其包名和类名如图&#xff0c;包名是com.hspedu.object_类名是Monster。 Integer.toHexString&#xff08;hashCode&#xff08;&#xff09;&#xff09;&#xff1b;是得到其…

【2024最新版】Vue前端面试篇,看这一篇就够了

文章目录 Vue常用的指令都有哪些v-bind和v-model的区别Vue2的生命周期有哪些Vue3的生命周期有哪些vue3中创建响应式变量的方法ref和reactive原理vuex有哪些方法vue-router生命周期钩子vue框架和原生JavaScript有什么区别对于提升项目加载速度和运行效率是怎么做的webpack能做什…

栈及栈的应用(有效的括号 力扣20)

栈的概念 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 画个图理解一下 咱们可以观…

【笔记:3D航路规划算法】一、随机搜索锚点(python实现,讲解思路)

目录 关键概念3D路径规划算法1. A*算法2. 快速随机锚点1. 初始化&#xff1a;2. 实例化搜索算法&#xff1a;3. 路径生成&#xff1a;4. 绘制图像&#xff1a; 3D路径规划是在三维空间中寻找从起点到终点的最短或最优路径的一种技术。它广泛应用于无人机导航、机器人运动规划、…

关于垂直领域大模型的探索和尝试

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

SpringCloud—08—高级之SpringCloud Alibaba中—Sentinel

文章目录 提前预知18、Sentinel是什么&#xff1f;18.1、sentinel是什么&#xff1f;18.2、Sentinel下载安装运行18.3、Sentinel初始化监控18.4、Sentinel流控规则1、流控规则基本介绍2、流控规则之-QPS-直接-快速失败3、流控规则之-线程数-直接失败4、流控规则之-QPS-关联-快速…

实战篇(十):使用Processing创建可爱花朵:实现随机位置、大小和颜色的花朵

使用Processing创建可爱花朵 0.效果预览1. 引言2. 设置Processing环境3. 创建花朵类4. 实现花瓣绘制5. 绘制可爱的笑脸6. 鼠标点击生成花朵7. 完整代码8. 总结与扩展0.效果预览 在本教程中,我们将使用Processing编程语言来创建一个可爱的花朵生成器。通过封装花朵为一个类,并…

git教程, 命令行版

前言 git就是代码版本管理系统&#xff0c;很简单的作用就是每一次commit之后&#xff0c;修改文件都是跟上一次commit的仓库文件做对比&#xff0c;也可以调出历史的文件查看某次commit修改了什么东西 0环境准备&#xff1a; 安装git, 百度一下&#xff0c;然后打开cmd&…

教室管理系统的开发与实现(Java+MySQL)

引言 教室管理系统是学校和培训机构日常运营中不可或缺的工具。本文将介绍如何使用Java、Swing GUI、MySQL和JDBC开发一个简单而有效的教室管理系统&#xff0c;并涵盖系统的登录认证、教室管理、查询、启用、暂停和排课管理功能。 技术栈介绍 Java&#xff1a;作为主要编程…