【oj刷题】滑动窗口篇:滑动窗口的应用场景和注意事项

news2024/9/20 8:01:54

前言:

滑动窗口其实基本原理还是双指针,但在双指针中左右指针可能会有回退操作,而滑动窗口的左右指针只会向前走,不会回退,下面就来讲解一下滑动窗口的概念和具体操作(主要是例题讲解)

目录

一、什么是滑动窗口?

二、滑动窗口的原理

三、滑动窗口的算法实现

四、滑动窗口的例题讲解

4.1. 长度最小的子数组

4.2 无重复字符的最长子串

4.3 找到字符串中所有字母异位词


一、什么是滑动窗口?

 滑动窗口是一种动态数据结构,它包含一系列元素,这些元素按照一定的顺序排列。滑动窗口的特点是窗口的大小可以动态调整,窗口中的元素可以向前或向后滑动。

下面我们通过一道例题来具体的看一下滑动窗口是什么:

力扣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

提示:

  • 1 <= target <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

理解完题意之后我们就来看一下下面的讲解:

以上就是滑动窗口的定义,根据滑动窗口的定义我们需要知道在使用滑动窗口必须是左右指针都不会回退,一起向前的才可以

二、滑动窗口的原理

  1. 窗口大小:滑动窗口的大小是指窗口中元素的数量。窗口大小可以是固定的,也可以是动态变化的。
  2. 窗口位置:滑动窗口的位置是指窗口在数据序列中的起始位置。
  3. 窗口滑动:当窗口向前或向后滑动时,窗口中的元素会发生变化。滑动窗口的核心思想是利用窗口中的元素进行计算或分析。

三、滑动窗口的算法实现

  1. 简单滑动窗口:假设窗口大小为k,数据序列为S,滑动窗口算法如下:

    • 初始化窗口位置为0,窗口大小为k。
    • 遍历数据序列S,计算窗口中的元素和。
    • 当窗口向前滑动时,更新窗口中的元素和。
    • 输出窗口中的元素和。
  1. 动态窗口大小:当窗口大小动态变化时,需要根据实际情况调整算法。(上面图中我们举的例子就是一个动态滑动窗口)以下是一个简单的示例:

    • 初始化窗口位置为0,窗口大小为k。
    • 遍历数据序列S,计算窗口中的元素和。
    • 当窗口向前滑动时,根据需要调整窗口大小,并更新窗口中的元素和。
    • 输出窗口中的元素和。

四、滑动窗口的例题讲解

4.1. 长度最小的子数组

这个就是上面的那个例题,算法原理我们已经讲过了,现在我们直接来看一下它的实现:

int minSubArrayLen(int target, vector<int>& nums) {
    int n = nums.size(), sum = 0, ret = INT_MAX;
    for (int left = 0, right = 0; right < n; right++)
    {
        sum += nums[right];   //进窗口
        while (sum >= target)
        {
            ret = min(ret, right - left + 1);
            sum -= nums[left++];   //出窗口
        }
    }
    return ret == INT_MAX ? 0 : ret;
}

通过这段代码我们可以看到滑动窗口一般分为这几步:

1、循环(一般是当right走到数组尾部的时候停止)

2、进窗口:在right右移时会有新的元素进到窗口里面

3、判断+出窗口:根据题意判断是否满足条件,然后让left右移让窗口中的元素出去

这几步就是滑动窗口类题的基本格式,大部分题直接套这个公式就行了,下面我们再来看几个题来巩固一下

4.2 无重复字符的最长子串

力扣3

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

示例 1:

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

示例 2:

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

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

题意解析:本题要求的就是一个字符串中的不重复的最长字串,题意并不难理解,值得我们思考的有一点,就是当新元素进窗口时,我们如何可以知道它窗口中已经有这个元素呢?相信你心中已经有了答案,没错,就是借助哈希表来标记窗口中已经有过的字符,且当元素种类较少时,我们可以直接借助一个整形数组来模拟哈希表,下面我们先来看一下本题的推导过程,然后再看一下代码实现:

推导过程:

代码实现:

int lengthOfLongestSubstring(string s) {
    int hash[128] = { 0 };   //使用数组来模拟哈希表
    int left = 0, right = 0, n = s.size();
    int ret = 0;
    while (right < n)
    {
        hash[s[right]]++;
        while (hash[s[right]] > 1)
        {
            hash[s[left++]]--;   //出窗口
        }
        ret = max(ret, right - left + 1);    //更新结果
        right++;    //让下一个元素进入窗口
    }
    return ret;
}

4.3 找到字符串中所有字母异位词

力扣438

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

 示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

提示:

  • 1 <= s.length, p.length <= 3 * 104
  • s 和 p 仅包含小写字母

本题往简单点看就是找到字符串中的特定字串,只是并不要求顺序一致,这道题也是需要结合哈希表来实现的,跟上面的做题格式基本一致,下面我们直接来看一下代码实现:

vector<int> findAnagrams(string s, string p) {
    vector<int> ret;
    int hash1[26] = { 0 };     //统计字符串p中每个字符出现的个数
    for (auto e : p) hash1[e - 'a']++;
    int hash2[26] = { 0 };    //统计窗口里面每个字符出现的个数
    int m = p.size();
    for (int left = 0, right = 0, count = 0; right < s.size(); right++)
    {
        char in = s[right];
        if (++hash2[in - 'a'] <= hash1[in - 'a']) count++;  //进窗口+维护count
        if (right - left + 1 > m)
        {
            char out = s[left++];
            if (hash2[out - 'a']-- <= hash1[out - 'a']) count--;   //出窗口+维护count
        }
        //更新结果
        if (count == m) ret.push_back(left);
    }
    return ret;
}

感谢各位大佬观看,创作不易,还望各位大佬点赞支持!!!

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

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

相关文章

【 Linux】基础命令及常用小技巧

文章目录 Linux基础命令常用小技巧基本命令pwd : print work directory 打印当前的工作目录cd : change driectory 改变当前工作目录ls: list 查看指定目录下的文件mkdir: make directory 创建目录 文件操作命令查找命令管道命令和过滤命令wc : word count 单词统计echo 输出命…

Hotohiko Sakamoto算法,以及用其计算星期几【算法 15】

探索Hotohiko Sakamoto算法&#xff1a;构建素数排列的奥秘 在算法领域&#xff0c;Hotohiko Sakamoto算法以其独特的构造方式和深刻的数学背景&#xff0c;吸引了众多算法爱好者和研究者的关注。本文将带您一起探索Hotohiko Sakamoto算法的核心思想&#xff0c;了解它是如何构…

深度学习_GPT2Block详解(casual attention)

一、GTP2Block 整体结构 1.1 block准备 import torch from torch import nn from transformers import GPT2Model, GPT2Config from transformers.models.gpt2.modeling_gpt2 import GPT2Blockcfg GPT2Config() print(cfg.add_cross_attention) blk GPT2Block(cfg, layer_…

“汉语新解” Prompt新高度,火爆的李继刚

“汉语新解” prompt 是由李继刚设计的一个用于启发人工智能模型进行创意性文本生成的指令模板。这个 prompt 的设计初衷是为了让AI能够以一种独特的方式解析和重新诠释常见的中文词汇&#xff0c;从而产生出具有深刻洞察力和幽默感的文本内容&#xff0c;仿佛是由鲁迅或林语堂…

Linux线程同步:深度解析条件变量接口

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;Linux线程同步&#x1f409;条件变量---实现线程同步&#x1f4a7;同步概念与竞态条件&#x1f406;条件变量接口*初始…

sqli-labs靶场自动化利用工具——第13关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#…

每日OJ_牛客_马戏团(模拟最长上升子序列)

目录 牛客_马戏团&#xff08;模拟最长上升子序列&#xff09; 解析代码 牛客_马戏团&#xff08;模拟最长上升子序列&#xff09; 马戏团__牛客网 搜狐员工小王最近利用假期在外地旅游&#xff0c;在某个小镇碰到一个马戏团表演&#xff0c;精彩的表演结束后发现团长正和大…

《基于深度半监督学习的目标检测综述》泛读

基于深度半监督学习的目标检测方法分为 1、生成式方法 2、一致性正则化方法 3、基于图的方法 4、伪标记方法和混合方法 然后基于常用数据集 对典型方法进行了性能对比&#xff0c;最后分析了其挑战和发展趋势&#xff0c;旨在为相关研究提供参考 收获就是&#xff1a; 1…

Redis -- 全记录(面试)

目录 All : 缓存穿透 缓存击穿 互斥锁 逻辑过期 比较 : 缓存雪崩 redis怎么和数据库保持一致 双写一致性 : 延迟双删 : 保证强一致性 : 允许一定的延迟 基于mq的异步通知 基于Canal的异步通知 总结 Redis的持久化 RDB AOF 总结 Redis数据过期策略 惰性删除…

【算法专题】搜索算法

二叉树剪枝 LCR 047. 二叉树剪枝 - 力扣&#xff08;LeetCode&#xff09; 本题要求我们将全部为0的二叉树去掉&#xff0c;也就是剪枝&#xff0c;当我们举一个具体的例子进行模拟时&#xff0c;会发现&#xff0c;只关注于对其中一个子树的根节点进行剪枝&#xff0c;由于我…

Docker部署MySQL8.0.39报错解决方案

Docker部署MySQL8.0.39报错解决方案 2024-09-11T06:09:09.317582Z 0 [Warning] [MY-010139] [Server] Changed limits: max_open_files: 1024 (requested 8161) 2024-09-11T06:09:09.317586Z 0 [Warning] [MY-010142] [Server] Changed limits: table_open_cache: 431 (reques…

李彦宏内部讲话曝光,谈大模型三大认知误区:智能体还是非共识

“外界对大模型有相当多的误解&#xff0c;”近日据媒体报道&#xff0c;李彦宏的一则内部讲话曝光。在最近一次和员工交流中&#xff0c;李彦宏谈及三个大模型认知误区&#xff0c;涵盖了大模型竞争、开源模型效率、智能体趋势等热点话题。 李彦宏认为未来大模型之间的差距可…

【Axure教程】高级搜索

高级搜索可以通过使用精确的关键词或短语&#xff0c;帮助用户找到特定的内容。尤其在面对大量搜索结果时&#xff0c;通过过滤条件缩小范围&#xff0c;能够节省时间。他允许用户使用多个条件进行组合&#xff08;例如条件匹配、模糊搜索、区间筛选等&#xff09;来精准获取相…

购物车装载状态检测系统源码分享

购物车装载状态检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

瑞幸卖奶茶,霸王茶姬不慌

瑞幸和霸王茶姬&#xff0c;打不起来。 转载定焦&#xff08;dingjiaoone&#xff09;原创 作者 | 苏琦 编辑 | 魏佳 最近&#xff0c;瑞幸因为联名游戏大作《黑神话&#xff1a;悟空》无法核销套餐被骂上热搜&#xff0c;但业内人士更关注的&#xff0c;是它不久前推出的轻乳…

【网络安全】-rce漏洞-pikachu

rce漏洞包含命令执行漏洞与代码执行漏洞 文章目录 前言 什么是rce漏洞&#xff1f; 1.rce漏洞产生原因&#xff1a; 2.rce的分类&#xff1a; 命令执行漏洞&#xff1a; 命令拼接符&#xff1a; 常用函数&#xff1a; 代码执行漏洞&#xff1a; 常用函数&#xff1a; 分类&…

AI算力池化技术助力运营商打造智算生态

数字经济时代&#xff0c;算力已成为国民经济发展的重要基础设施。随着数字化转型的不断深入和人工智能技术的广泛应用&#xff0c;构建以新型智算中心为核心的智能算力生态体系正驱动着数字经济快速发展&#xff0c;成为人工智能赋能千行百业的重中之重。 2022年2月&#xff…

Vulnhub-RickdiculouslyEasy靶场(9个flag)

flag1 端口9090有一个flag flag2 13337端口 flag3 使用dirb进行扫描网站的80端口&#xff0c;发现一些敏感文件 访问80端口&#xff0c;没有发现有效信息 访问passwords目录 访问FLAG.txt 再返回访问passwords.html文件 查看页面源代码发现一个密码 flag4 之前扫描到了robo…

书接上文,介绍下Quartz Java体系结构

体系结构总结 JobDetail 我们创建一个实现 Job 接口的类&#xff0c;使用 JobBuilder 包装成 JobDetail&#xff0c;它可以携带 KV 的数据。 Trigger 定义任务的触发规律&#xff0c;Trigger&#xff0c;使用 TriggerBuilder 来构建。JobDetail 跟 Trigger 是 1:N 的关系。思…

智慧物流系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;车辆管理&#xff0c;商品管理&#xff0c;物流信息管理&#xff0c;论坛管理&#xff0c;公告信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品&#xff0c;论坛&#xff0c;我的 …