Leetcode滑动窗口的使用

1.滑动窗口

文章目录

    • 1.滑动窗口
      • 1.1 什么是滑动窗口?
      • 1.2 解题思路
      • 1.3 扩展

1.1 什么是滑动窗口?

滑动窗口是一种处理数组或序列数据时常用的数据结构和算法思想。在计算机科学中,它通常涉及在数组上设置一个可变的窗口,该窗口可以向右(或向左)“滑动”,以覆盖不同的元素组合。这个窗口定义了一个固定的大小,或者根据特定条件动态调整大小,从而帮助我们解决一系列问题,如查找子数组、统计字符频率、计算最大/最小值、求和等等。

滑动窗口算法的关键步骤包括:

  1. 初始化窗口:在序列的起始位置设定一个大小为 k 的窗口。
  2. 窗口滑动:逐步向右(或按需向左)移动窗口,每次移动通常涉及移除最左边的元素并添加最右边的新元素到窗口中,保持窗口大小不变。
  3. 检查条件:在每次窗口滑动后,检查当前窗口内的元素是否满足某个预设条件(如总和达到目标值、所有元素唯一等)。
  4. 记录结果:如果满足条件,记录或更新所需的结果(如窗口大小、窗口内元素等)。

滑动窗口技术广泛应用于各种问题解决中,比如在字符串中查找无重复字符的最长子串、计算固定大小内的最大值或最小值、连续子数组问题等。它通过减少遍历和重计算的次数,提高了算法效率。

1.2 解题思路

题目原文:

给定一个含有 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

解题思路:

详细步骤:

  1. 初始化:
    • result 初始化为 INT32_MAX,用于存储满足条件的最短子数组长度。由于我们要找的是最小长度,初始设定一个极大值确保后续可以被任何有效的子数组长度替换。
    • ij 分别作为滑动窗口的左右边界,初始时窗口内不包含任何元素,因此 i = j = 0
    • sum 初始化为 0,用于累计窗口内元素的和。
  2. 扩展窗口:
    • 通过移动右边界 j 向前(j++),并将新元素加入窗口(累加到 sum),不断尝试扩展窗口,直到窗口内元素之和 sum 至少等于 target
  3. 收缩窗口与更新结果:
    • 当窗口内元素和 sum 大于等于 target 时,说明找到了一个满足条件的子数组。此时,计算子数组长度 SubLength = j - i + 1
    • 检查当前子数组长度是否小于之前记录的最小长度 result,如果是,则更新 result 为当前子数组长度。
    • 为了寻找更短的子数组,从窗口中移除最左侧的元素(减去 nums[i++]),同时收缩窗口,继续寻找其他可能的子数组。
  4. 遍历数组:
    • 上述扩展与收缩窗口的过程在数组 nums 的每个元素上迭代执行,直到右边界 j 遍历完整个数组。
  5. 处理结果:
    • 最后,检查 result 是否仍为初始值 INT32_MAX,如果是,则说明未找到满足条件的子数组,返回 0;否则,返回 result 作为最短子数组的长度。

题解:

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int result = INT32_MAX;int i = 0;int sum = 0;int SubLength = 0;for(int j = 0;j < nums.size();++j){sum += nums[j];while(sum >= target){SubLength = j - i + 1;result = result < SubLength ? result : SubLength;sum -= nums[i++];}}return result == INT32_MAX ? 0 : result;}
};
  1. int result = INT32_MAX;: 初始化结果变量 resultINT32_MAX,这是一个表示32位有符号整数最大值的常量。这样做是因为我们要寻找的是最小长度,初始化为一个极大值可以保证后续任何找到的有效长度都能替换这个初始值。

  2. int i = 0;: 初始化左指针 i 为0,用于标记滑动窗口的开始位置。

  3. int sum = 0;: 初始化当前窗口内元素的和 sum 为0。

  4. int SubLength = 0;: 初始化一个临时变量 SubLength 用于存储当前窗口的长度。

  5. for(int j = 0;j < nums.size();++j){: 使用一个外层循环,由指针 j 控制遍历数组 nums 的每一个元素。

  6. sum += nums[j];: 在每次迭代中,将当前元素 nums[j] 加入到 sum 中,即扩展滑动窗口的和。

  7. while(sum >= target){: 如果当前窗口的和 sum 大于等于目标值 target,则进入内部循环尝试缩小窗口并更新结果。

  8. SubLength = j - i + 1;: 计算当前窗口的长度,即从索引 ij 的元素数量。

  9. result = result < SubLength ? result : SubLength;: 更新结果变量 result,如果当前窗口长度 SubLength 比已知的最小长度还要小,则用 SubLength 替换 result

  10. sum -= nums[i++];: 缩小窗口,从 sum 中减去 nums[i] 的值,并将左指针 i 向右移动一位,准备检查下一个可能的子数组。

  11. }: 结束内部的 while 循环。

  12. }: 结束外部的 for 循环。

  13. return result == INT32_MAX ? 0 : result;: 最后,检查结果 result 是否仍然为初始值 INT32_MAX,如果是,则说明没有找到满足条件的子数组,返回 0;否则,返回找到的最短子数组长度 result

1.3 扩展

题目原文:

给你两个字符串 s1s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false

换句话说,s1 的排列之一是 s2子串

示例 1:

输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").

示例 2:

输入:s1= "ab" s2 = "eidboaoo"
输出:false

题解:

class Solution {
public:bool checkInclusion(string s1, string s2) {sort(s1.begin(),s1.end());int left = 0;int right = s1.size();while(right <= s2.size()){string s3 = s2.substr(left , s1.size());sort(s3.begin(),s3.end());if(s3 == s1){return true;}left++;right++;}return false;}
};

思路:

  1. 排序s1:首先对字符串s1中的字符进行排序。这样做的目的是为了后续可以方便地比较两个字符串的字符排列是否相同。

  2. 双指针滑动窗口:使用两个指针leftright定义一个大小与s1相同的窗口,这个窗口将在s2上滑动。初始化时,left = 0right = s1.size()

  3. 循环遍历s2:在循环中,窗口的右边界逐渐向右扩展,直到覆盖整个s2字符串。循环条件为right <= s2.size()

  4. 提取子串并排序:每次循环中,从s2中提取大小与s1相同的子串s3(由索引leftleft + s1.size() - 1的字符组成),并对这个子串进行排序。

  5. 比较排序后的子串:将排序后的子串s3与排序后的s1进行比较。如果两者相等,说明当前窗口内的字符排列与s1相同,函数返回true

  6. 窗口滑动:如果当前窗口内的字符排列与s1不同,则窗口向右滑动一位:增加leftright的值各1,继续下一次循环检查新的子串。

  7. 循环结束处理:如果循环结束后都没有找到匹配的子串,说明s2中不存在s1的排列作为子串,函数返回false

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

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

相关文章

PCL-基于FPFH的SAC-IA结合ICP的点云配准方法

目录 一、相关方法原理1.凸包方法2.FPFH特征描述3.SAC-IA概述4.ICP概述 二、实验代码三、实验结果 一、相关方法原理 点云是在同一空间参考系下表达目标空间分布和目标表面特性的海量点集合&#xff0c;在获取物体表面每个采样点的空间坐标后&#xff0c;得到的是点的集合&…

【java技术】xxl-job的实现

Xxl-Job 是一个轻量级的分布式任务调度平台&#xff0c;它支持定时任务的创建、管理、执行和监控。Xxl-Job 的设计理念是简单易用、轻量级、高性能&#xff0c;适合于微服务架构下的任务调度场景。 Xxl-Job 的实现原理涉及到几个关键组件和技术细节。下面是 Xxl-Job 的核心组件…

构建智能运维系统:创新架构与效率优化

随着信息技术的迅猛发展&#xff0c;企业对于运维效率和服务质量的要求越来越高。智能运维系统的设计和实施&#xff0c;不仅能够提升系统可靠性和响应速度&#xff0c;还能有效降低成本和人力投入。本文将深入探讨智能运维系统的架构设计原则和关键技术&#xff0c;为企业在运…

数据结构重置版(概念篇)

本篇文章是对数据结构的重置&#xff0c;且只涉及概念 顺序表与链表的区别 不同点 顺序表 链表 存储空间上 物理上一定连续 逻辑上连续&#xff0c;但物理上不一定连续…

MYSQL(2) 高级查询

文章目录 概述高级查询基础查询条件查询范围查询判空查询模糊查询分页查询查询后排序分组查询 小结 概述 接上篇&#xff0c;上篇写到增删改查。这篇继续。 高级查询 基础查询 -- 全部查询 select * from student; -- 只查询部分字段 select sname, class_id from student;…

.env.local 配置本地环境变量 用于团队开发

.env.local 用途&#xff1a;.env.local 通常用于存储本地开发环境中的环境变量。这些变量可能包括敏感数据或特定于单个开发者的设置&#xff0c;不应该被提交到版本控制系统中。优先级&#xff1a;在大多数框架中&#xff0c;.env.local 文件中的变量会覆盖其他 .env 文件中…

Java唯一订单编号生成

在Java中生成唯一的订单编号通常需要结合时间戳、随机数和/或序列号等元素来确保唯一性。下面是一个简单的示例&#xff0c;使用当前时间的毫秒值加上一个随机数来生成订单号。为了简化&#xff0c;我们将使用​​java.util.UUID​​类来生成一个全局唯一的UUID&#xff0c;并将…

分类模型的完整流程及Python实现

1、加载函数和数据集 import numpy as np from sklearn.datasets import load_breast_cancer from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt cancer…

linux系统查历史cpu使用数据(使用sar 查询cpu和网络占用最近1个月历史数据)。

一 sar 指令介绍 在 Linux 系统中&#xff0c;sar 是 System Activity Reporter 的缩写&#xff0c;是一个用于收集、报告和保存系统活动信息的工具。它是 sysstat 软件包的一部分&#xff0c;提供了丰富的系统性能数据&#xff0c;包括 CPU、内存、网络、磁盘等使用情况&am…

Jdk有哪些版本

JDK(Java Development Kit)是Java编程语言的软件开发工具包,其版本随着Java语言的不断发展而更新。以下是JDK的一些主要版本及其相关信息: JDK 8(发布于2014年3月):引入了一系列新功能,如Lambda表达式、函数式接口、Stream API和新的日期/时间API等。是Java历史上一个…

SQL中的LEFT JOIN、RIGHT JOIN和INNER JOIN

在SQL中&#xff0c;JOIN操作是连接两个或多个数据库表&#xff0c;并根据两个表之间的共同列&#xff08;通常是主键和外键&#xff09;返回数据的重要方法。其中&#xff0c;LEFT JOIN&#xff08;左连接&#xff09;、RIGHT JOIN&#xff08;右连接&#xff09;和INNER JOIN…

《JavaEE篇》--多线程(2)

《JavaEE篇》--多线程(1) 线程安全 线程不安全 我们先来观察一个线程不安全的案例&#xff1a; public class Demo {private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {//让count自增5W次…

HarmonyOS网络请求的简单用法,HttpUtil简单封装

请求网络获取数据 点击按钮发送一个post请求&#xff0c;发送一条string由于此处的返回result.data本身就是一个string&#xff0c;因此不需要转换类型 Button(请求网络).margin({ top: 10 }).fontSize(24).fontWeight(FontWeight.Bold).onClick(() > {httpRequestPost(http…

JVM 内存结构、垃圾回收机制与并发容器

目录 一、JVM 内存结构 1. 程序计数器&#xff08;Program Counter Register&#xff09;&#xff1a; 2. Java 虚拟机栈&#xff08;JVM Stack&#xff09;&#xff1a; 3.本地方法栈&#xff08;Native Method Stack&#xff09;&#xff1a; 4.堆&#xff08;Heap&#xff…

Android笔试面试题AI答之控件Views(6)

答案来着文心一言&#xff0c;仅供参考 目录 1.简述什么是RemoteViews?使用场景有哪些?RemoteViews的特性使用场景总结 2.获取View宽高的几种方法?1. 在onWindowFocusChanged方法中获取2. 使用ViewTreeObserver.OnGlobalLayoutListener3. 使用ViewTreeObserver.OnPreDrawLi…

风格迁移开发记录(DCT-Net)

1.DCT-Net部署 阿里旗下的 modelscope社区&#xff0c;丰富的开源风格迁移算法模型 DCT-Net GitHub链接 git clone https://github.com/menyifang/DCT-Net.git cd DCT-Netpython run_sdk.py下载不同风格的模型如下图每个文件夹代表一种风格&#xff0c;有cartoon_bg.pb, car…

C++STL详解(一)——String接口详解(上)!!!

目录 一.string类介绍 二.string类的构造赋值 2.1string类的拷贝和构造函数 2.2深拷贝 三.string类的插入 3.1push_back 3.2append 3.3操作符 3.4insert 四.string的删除 4.1pop_back 4.2erase 五.string的查找 5.1find 5.2rfind 六.string的比较 6.1compare函…

独家|二十年国货羊奶粉老品牌发力成人奶粉,瞄准低GI、特医食品

前言 中国羊奶看陕西。 作为陕西省农业产业化重点企业以及陕西省专精特新企业&#xff0c;成立于2004年的羊奶粉品牌雅泰乳业正在不断进行深入布局。 雅泰乳业成人粉部门销售总监于维涛近日向AgeFood表示&#xff0c;雅泰成人奶粉业务主要分为两部分。一部分是以雅泰牧歌、龙…

深入浅出WebRTC—Pacer

平滑发包&#xff08;Pacer&#xff09;是 WebRTC 实现高质量实时通信不可或缺的一部分。在视频通信中&#xff0c;单帧视频可能包含大量的数据&#xff0c;如果未经控制地立即发送&#xff0c;可能瞬间对网络造成巨大压力。Pacer 能够根据网络条件动态调整发送速率&#xff0c…

SpringBoot事务管理、任务调度、Mail整合。

一.Spring Boot中的事务管理 编程式事务 : 在代码中硬编码(不推荐使用):通过 TransactionTemplate 或者 TransactionManager 手动管理事务&#xff0c;实际应用中很少使用&#xff0c;用于理解Spring 事务管理。 声明式事务:在 XML 配置文件或者基于注解 Transactional(推荐使…