基础算法之滑动窗口--Java实现(上)--LeetCode题解:长度最小的子数组-无重复字符的子串-最大连续1的个数III-将x减到0的最小操作数

这里是Thembefue
今天讲解算法中较为经典的一个算法 => 滑动窗口
本讲解主要通过题目来讲解以理解算法
讲解分为三部分:题目解析 => 算法讲解 => 编写代码
滑动窗口
在正式进入题目的讲解之前,得先了解一下什么是滑动窗口,以及应该在什么情况下使用。
滑动窗口其实是由"暴力遍历"优化来的,其本质也是双指针,但这个双指针是利用数组等单调性同向移动的,不会倒退,使其像一个窗口一个从左向右滑动。
长度最小的子数组
题目解析

找到一个子数组,使这个子数组的和大于等于给定的目标值,子数组是数组上连续的一段,一定是连续的!
算法讲解
本题使用暴力遍历的时间复杂度位O(n*2),所以一定会超时。
所以我们在暴力遍历的基础上进行优化,根据数组的单调性,我们没必要在 left 指针向右移时,让 right 指针重新回来再遍历一次,这样会导致重复遍历,徒增时间。
滑动窗口:这个过程一般都分为四步,进窗口,判断,出窗口,更新结果。
其中更新结果可能在出窗口前,也可能在出窗口后,根据题目意思即可。
我们先维护一个 sum 变量,用于表示当前窗口中所有元素的全部和,当和大于等于 target时,我们便可更新结果,并且让此时应该让left 指向的元素出窗口。

编写代码
class Solution {public int minSubArrayLen(int target, int[] nums) {int left = 0, right = 0;int sum = 0, len = Integer.MAX_VALUE;while (right < nums.length) {// 进窗口sum += nums[right];// 开始缩小窗口while (sum >= target) {len = Math.min(len, right - left + 1);sum -= nums[left++]; // 出窗口} right++;}return len == Integer.MAX_VALUE ? 0 : len;}
}
无重复字符的最长子串
题目解析
子串和子数组其实就是一个意思,连续的一段子字符串,且这段字符串不能出现重复的字符,返回其最长子串。
算法讲解
本题需要借用一个数据结构来实现,也即是哈希表,哈希表记录某个字符出现的次数。
首先是进窗口操作,也就是把当前字符放入到哈希表,同时更新其出现的次数。
当出现了两次相同的字符时,说明此子串不符合条件。此时 left 指针移动,缩小窗口。
随后更新结果。

编写代码
class Solution {public int lengthOfLongestSubstring(String s) {int[] hash = new int[128];int left = 0, right = 0;int len = 0;while (right < s.length()) {// 进窗口hash[s.charAt(right)]++;while (hash[s.charAt(right)] > 1) {// 出窗口hash[s.charAt(left++)]--;}// 更新数据len = Math.max(len, right - left + 1);right++;}return len;}
}
最大连续1的个数 III
题目解析
同样是求符合条件的最长子数组,但其实不用真的修改数组的元素,不然要改回去就麻烦了。
算法讲解
我们可以使用一个计数器,来统计此时窗口中0出现的次数,0出现了多少次,就要将其变成1多少次。所以进出窗口的操作大差不差。
但是有一个细节,在出窗口时,0计数器不能直接减小,但 left指向的元素为0时,才能减去,否则 left一直减小,直到 0计数器减小到题目条件时。

编写代码
class Solution {public int longestOnes(int[] nums, int k) {int zeroCount = 0, ret = 0;int left = 0, right = 0;while (right < nums.length) {// 进窗口if (nums[right++] == 0) zeroCount++;while (zeroCount > k) {if (nums[left++] == 0) zeroCount--; // 出窗口}ret = Math.max(ret, right - left);}return ret;}
}
将 x 减到 0 的最小操作数
题目解析
选取数组最左边或者最右边的元素,从 x 中减去该元素,直到将 x 减为0为止,但得返回最小的操作次数。
注意:只能选取最左边或者最右边的元素,选过的元素从数组中删除,不能再使用。
算法讲解
这题乍一看好像并不是滑动窗口,因为一下操作左边,一下操作右边,并不能形成连续的一段。
但是看问题的角度有多种,俗话说:正难则反。假设我们现在选取了左边和右边的元素的一个,假设此时这两个数字的和正好等于 x,也就是满足题目的条件。
我们不难发现,除去这两个数字,剩下的元素其实构成了一个子数组,也就是一个窗口,且这个窗口的值等于数组所有元素的总和减去 x。
掌握了这个性质,这题就迎刃而解了。

编写代码
class Solution {public int minOperations(int[] nums, int x) {int left = 0, right = 0;int ret = -1;int sum = 0;for (int i: nums) sum += i;int target = sum - x, temp = 0;if (target < 0) return -1;while (right < nums.length) {// 进窗口temp += nums[right];// 判断while (temp > target) {temp -= nums[left++]; // 出窗口}if (temp == target) ret = Math.max(ret, right - left + 1);right++;}return ret == -1 ? -1 : nums.length - ret;}
}
好了,以上就是今天内容的全部讲解,如果有不懂的地方,随时私聊😘
我们下半部分见😁

相关文章:
基础算法之滑动窗口--Java实现(上)--LeetCode题解:长度最小的子数组-无重复字符的子串-最大连续1的个数III-将x减到0的最小操作数
这里是Thembefue 今天讲解算法中较为经典的一个算法 > 滑动窗口 本讲解主要通过题目来讲解以理解算法 讲解分为三部分:题目解析 > 算法讲解 > 编写代码 滑动窗口 在正式进入题目的讲解之前,得先了解一下什么是滑动窗口,以及应该在什…...
Linux -- 文件系统(文件在磁盘中的存储)
目录 前言: 了解机械磁盘 初始盘片与磁头 盘片是怎么存数据的呢? 详解盘片 如何访问磁盘中的一个扇区呢? -- CHS 定位法 磁盘的逻辑存储 LBA(Logical Block Addressing --- 逻辑块寻址) 如何将 LBA 地址转换为…...
微服务(Microservices),服务网格(Service Mesh)以及无服务器运算Serverless简单介绍
文章目录 什么是微服务?一、定义与特点二、优势三、组件与架构四、应用场景五、挑战与解决方案什么是服务网格?一、定义与特点二、核心组件三、主要功能四、实现工具五、应用场景六、优势与挑战什么是Serverless?一、定义与特点二、主要领域三、优势四、应用场景五、挑战三者…...
【AIGC】AI时代的数据安全:使用ChatGPT时的自查要点
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯法律法规背景中华人民共和国保守秘密法中华人民共和国网络安全法中华人民共和国个人信息保护法遵守法律法规的重要性 💯ChatGPT的数据使用特点ChatGPT数据安全…...
什么是区块链桥?
什么是区块链桥? 区块链桥是一种实现资产从一个区块链转移至另一个区块链的工具,它解决了区块链技术中不同网络之间缺乏互操作性的问题。区块链桥通过创建代表另一区块链资产的合成衍生品,使得原本互不兼容的区块链资产能够相互连接和转移。…...
机器学习框架
机器学习框架 机器学习框架是用于开发和部署机器学习模型的软件工具。它们提供了一组API和工具,帮助开发人员在各种计算设备上构建、训练和部署机器学习模型。以下是几个常见的机器学习框架: 1.TensorFlow: TensorFlow是一个开源的人工智能…...
金三银四:20道前端手写面试题
文章目录 一、前言二、题目1. 防抖节流解读 2.一个正则题3. 不使用a标签,如何实现a标签的功能4. 不使用循环API 来删除数组中指定位置的元素(如:删除第三位) 写越多越好5. 深拷贝解读 6. 手写call bind applycall 解读apply 解读 …...
RAC被修改权限及相关问题
RDBMS : 19.19 修改RAC权限及相关问题 修改RAC权限,参考文档: How to check and fix file permissions on Grid Infrastructure environment (Doc ID 1931142.1) Script to capture and restore file permission in a directory (for eg. O…...
Golang | Leetcode Golang题解之第441题排列硬币
题目: 题解: func arrangeCoins(n int) int {return sort.Search(n, func(k int) bool { k; return k*(k1) > 2*n }) }...
数学建模--什么是数学建模?数学建模应该怎么准备?
前言 这是去年底学数学建模老哥的建模课程笔记;未来本人将陆陆续续的更新数学建模相关的一些基础算法,大家可以持续关注一下;提示:数学建模只有实战才能提升,光学算法没有啥意义,也很难学的很懂。 文章目录…...
Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 随着电商行业的蓬勃发展,物流行业迎来了前所未有的机遇与挑战。面对日益增长的订单量和复…...
【数据分享】2000—2023年我国省市县三级逐月植被覆盖度(FVC)数值(Shp/Excel格式)
之前我们分享过2000—2023年我国250米分辨率逐月植被覆盖度(FVC)栅格数据(可查看之前的文章获悉详情),该数据来源于高吉喜等学者在国家青藏高原科学数据中心平台上分享的数据,合成方式采用月最大值合成&…...
《Linux从小白到高手》理论篇(十一):Linux的系统环境管理
值此国庆佳节,深宅家中,闲来无事,就多写几篇博文。本篇详细深入介绍Linux的系统环境管理。 环境变量 linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容。如果每…...
Qt/C++开源控件 自定义雷达控件
使用Qt框架创建一个简单的雷达图,包含动态扫描、目标点生成、刻度和方向标识。代码实现使用C编写,适合用作学习和扩展的基础。 1. 头文件与基本设置 #include "RadarWidget.h" #include <QPainter> #include <QPen> #include &…...
什么是IDE(集成开发环境)?
集成开发环境(IDE)详解 在软件开发的世界中,集成开发环境(IDE,Integrated Development Environment)扮演着至关重要的角色。它是一个综合性的软件应用程序,旨在为软件开发者提供一整套的、易于使用的工具集,以便他们能够更高效地编写、调试、测试和部署代码。简而言之…...
【Linux】用虚拟机配置Ubuntu 24.04.1 LTS环境
目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件,大家自己去下啊! 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机,然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…...
MacOS升级Ruby版本详解:步骤、挑战与解决方案
MacOS升级Ruby版本详解:步骤、挑战与解决方案 在MacOS上升级Ruby版本是一个涉及多个步骤和考虑因素的过程。Ruby作为一种广泛使用的编程语言,其新版本通常会引入一系列改进,包括性能优化、安全修复和新特性。因此,升级Ruby版本不…...
Log4j的配置与使用详解
Log4j的配置与使用详解 Log4j介绍 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,我们可以控制每条日志的输出格式;只需要通过一个配置文件就可以灵活的配置,…...
docker 的目录有那些,分别存放什么东西
Docker 的目录结构和文件存放位置取决于你所使用的操作系统和Docker的版本。以下是一些常见的目录和它们通常存放的内容: 通用目录 /var/lib/docker (Linux) 这是Docker在Linux系统上的主要数据目录。存放了镜像、容器、数据卷、网络等的元数据和状态信息。具体结构…...
开源模型应用落地-模型微调-语料采集-数据格式化(四)
一、前言 在自然语言处理(NLP)的快速发展中,语料采集作为基础性的步骤显得尤为重要。它不仅为机器学习模型提供了所需的训练数据,还直接影响模型的性能和泛化能力。随着数据驱动技术的不断进步,如何有效并高效地收集、清洗和整理丰富多样的语料,已成为研究者和工程师们亟…...
最完整的llm-graph-builder入门指南:从安装到知识图谱可视化
最完整的llm-graph-builder入门指南:从安装到知识图谱可视化 【免费下载链接】llm-graph-builder Neo4j graph construction from unstructured data 项目地址: https://gitcode.com/GitHub_Trending/ll/llm-graph-builder 你还在为非结构化数据转化为结构化…...
ESP8266 KiCAD库零基础上手:高效配置开源硬件设计工具指南
ESP8266 KiCAD库零基础上手:高效配置开源硬件设计工具指南 【免费下载链接】kicad-ESP8266 Schematic symbols and PCB footprints for ESP8266 modules 项目地址: https://gitcode.com/gh_mirrors/ki/kicad-ESP8266 在开源硬件设计领域,KiCAD库&…...
Phi-4-Reasoning-Vision从零开始:双卡4090环境nvidia-smi调优
Phi-4-Reasoning-Vision从零开始:双卡4090环境nvidia-smi调优 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡4090环境优化。这个工具严格遵循官方SYSTEM PROMPT规范,…...
ChatGPT文档上传安全指南:如何避免敏感信息泄露
ChatGPT文档上传安全指南:如何避免敏感信息泄露 在当今AI应用开发热潮中,将文档上传至ChatGPT等大语言模型进行内容分析、总结或问答,已成为提升工作效率的常见场景。然而,许多开发者在兴奋地集成这一强大功能时,往往…...
Python 3.13 + CUDA 13.0编译轮子
核心工具链安装 1、安装 Visual Studio 2022 (勾选 “使用 C 的桌面开发”) 2、安装 CUDA Toolkit 13.0环境变量注入 在终端执行,确保编译器能精准定位 CUDA 路径:set CUDA_PATHD:\Program Files\NVIDIA_GPU_Computing_Toolkit\v13 set PATH%CUDA_PATH%\…...
会议纪要助手:OpenClaw+GLM-4.7-Flash实时转录与摘要
会议纪要助手:OpenClawGLM-4.7-Flash实时转录与摘要 1. 为什么需要自动化会议纪要 每次开完会最头疼的就是整理会议纪要。上周三的部门周会结束后,我花了40分钟反复听录音、手敲重点,结果还是漏掉了两个关键决议事项。这种低效重复劳动让我…...
不止于集成:在RuoYi-Camunda流程设计器中实现自定义属性面板与FEEL表达式校验
深度定制RuoYi-Camunda流程设计器:从属性面板扩展到FEEL表达式校验实战 当标准BPMN设计器无法满足复杂业务需求时,定制化开发成为必经之路。某跨国零售企业的审批系统曾因无法在流程节点上定义"区域经理审批阈值"字段,导致每次业务…...
JEECG Boot项目实战:如何优雅地移除登录验证码(前后端完整操作指南)
JEECG Boot项目实战:如何优雅地移除登录验证码(前后端完整操作指南) 在JEECG Boot的开发过程中,验证码功能虽然能有效防止恶意登录,但在某些特定场景下反而会成为效率瓶颈。想象一下这样的场景:开发团队正在…...
Ostrakon-VL-8B零基础上手:无需代码,5分钟完成门店图片智能分析
Ostrakon-VL-8B零基础上手:无需代码,5分钟完成门店图片智能分析 1. 引言 想象一下,你是一家连锁便利店的区域经理,手下管着几十家门店。每周巡店检查,光是看照片、数货架、查价格标签,就要花掉大半天时间…...
同花顺期货通指标编写指南:从零开始构建趋势波段共振系统(含避坑技巧)
同花顺期货通指标编写指南:从零开始构建趋势波段共振系统(含避坑技巧) 在期货交易中,技术指标是交易者不可或缺的分析工具。同花顺期货通作为国内主流的期货交易软件,其内置的指标编写功能为交易者提供了强大的自定义能…...
