【算法笔记】滑动窗口算法原理深度剖析

news2024/10/5 18:47:11

【算法笔记】滑动窗口算法原理深度剖析

🔥个人主页大白的编程日记

🔥专栏算法笔记


文章目录

  • 【算法笔记】滑动窗口算法原理深度剖析
    • 前言
    • 一.长度最小的子数组
      • 1.1题目
      • 1.2思路分析
      • 1.3算法流程
      • 1.4正确性证明
      • 1.5代码实现
    • 二.无重复字符的最长字串
      • 2.1题目
      • 2.2思路分析
      • 2.3代码实现
    • 三.水果成蓝
      • 3.1题目
      • 3.2思路分析
      • 3.3代码实现
    • 四.找到字符串中所有字母异位词
      • 4.1题目
      • 4.2思路分析
      • 4.3代码实现
    • 五.串联所有单词的子串
      • 5.1题目
      • 5.2思路分析
      • 5.3代码实现
    • 算法总结
    • 后言

前言

哈喽,各位小伙伴大家好!上期我们讲了双指针算法原理,今天我们继续讲解滑动窗口算法原理。话不多说,咱们进入正题!向大厂冲锋!

一.长度最小的子数组

1.1题目

  • 题目:长度最小的子数组

1.2思路分析

这里我们根据暴力算法借助单调性优化,利用滑动窗口解决问题。

1.3算法流程

1.4正确性证明

1.5代码实现

这里当right越界时说明我们枚举了所有情况,直接返回结果即可。

class Solution {
public:
  int minSubArrayLen(int target, vector<int>& nums)
   {
        int Min=INT_MAX;
        int sum=0;
        for(int left=0,right=0;right<nums.size();right++)
        {
            sum+=nums[right];//进窗口
            while(sum>=target)
            {
                Min=min(Min,right-left+1);//更新结果
                sum-=nums[left++];//出窗口
            }
        }
        return Min==INT_MAX?0:Min;
    }
};

二.无重复字符的最长字串

2.1题目

  • 题目:无重复字符的最长字串

2.2思路分析

2.3代码实现

这里我们用字符数组存储字符信息方便我们判断我们。

class Solution {
public:
    int lengthOfLongestSubstring(string s) 
    {
         int hash[128]={0};//存储字符信息
         int ret=INT_MIN;
         int left,right,n=s.size();·
         left=right=0;
         while(right<n)
         {
            hash[s[right]]++;//进窗口
            while(hash[s[right]]>1)
            {
                hash[s[left++]]--;//出窗口
            }
            ret=max(ret,right-left+1);//更新结果
            right++;
         }
         return ret==INT_MIN?0:ret;
    }
};

三.水果成蓝

3.1题目

  • 题目:水果成蓝

3.2思路分析

3.3代码实现

class Solution {
public:
    int totalFruit(vector<int>& fruits) 
    {
        int hash[100001]={0};//存储水果种类个数
        int ans=INT_MIN;
        for(int left=0,right=0,k=0,n=fruits.size();right<n;right++)
        {
            if(hash[fruits[right]]==0)//进窗口
            {
                k++;//种类增加
            }
            hash[fruits[right]]++;//记录个数
            while(k>2)
            {
                hash[fruits[left]]--;
                if(hash[fruits[left]]==0)//种类减少
                {
                    k--;
                }
                left++;//出窗口
            }
            ans=max(ans,right-left+1);//更新结果
        }
        return ans;
    }
};

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

4.1题目

  • 题目:找到字符串中所有字母异位词

4.2思路分析

4.3代码实现

class Solution {
public:
    vector<int> findAnagrams(string s, string p) 
    {
        vector<int> ret;
        int hash1[26]={0};
        int hash2[26]={0};
        for(auto a:p)
        {
            hash1[a-'a']++;
        }
        int count=0;//记录有效字符个数
        for(int left=0,right=0,n=s.size();right<n;right++)
        {
            char in=s[right];//进窗口
            if(++hash2[in-'a']<=hash1[in-'a'])
            {
                count++;//有效字符增加
            }
            if(right-left+1>p.size())
            {
                char out=s[left++];//出窗口
                if(hash2[out-'a']--<=hash1[out-'a'])
                {
                    count--;//有效字符减少
                }
            }
            if(count==p.size())
            {
                ret.push_back(left);//保存结果
            }
        }
        return ret;
    }
};

五.串联所有单词的子串

5.1题目

  • 题目:串联所有单词的子串

5.2思路分析

5.3代码实现

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        unordered_map <string ,int> hash1;//字符串哈希表
        vector<int> ret;
        for(auto a:words)
        {
            hash1[a]++;//填充哈希表存储单词个数
        }
        int len=words[0].size(),n=words.size();
        for(int i=0;i<len;i++)
        {
            unordered_map <string ,int> hash2;
            for(int left=i,right=i,count=0;right+len<=s.size();right+=len)
            {
                string in=s.substr(right,len);
                hash2[in]++;//填充哈希
                if(hash1.count(in)&&hash2[in]<=hash1[in])//判断是否有效字符串
                {
                    count++;//更新有效单词个数
                }
                if(right-left+1>len*n)//出窗口
                {
                    string out=s.substr(left,len);
                    if(hash1.count(out)&&hash2[out]<=hash1[out])//判断是否有效字符串
                    {
                        count--;//更新有效单词个数
                    }
                    hash2[out]--;//更新哈希
                    left+=len;
                }
                if(count==n)
                {
                    ret.push_back(left);//更新结果
                }
            }
        }
        return ret;
    }
};

算法总结

滑动窗口就是根据题目信息,在暴力枚举的条件下利用单调性优化,用同向双指针快速筛选掉一些不必要的遍历情况。在O(N)的复杂度下完成所有情况的枚举从而解题的算法。

后言

这就是滑动窗口算法原理的深度剖析。总而言之,滑动窗口就是在暴力枚举的情况下利用单调性,使用同向双指针在O(N)的复杂度完成枚举的算法。算法流程并不重要,重要的是背后的算法原理推到和证明。大家自己下去好好消化。今天就分享到,感谢各位的耐心垂阅!咱们下一期见!拜拜~

在这里插入图片描述

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

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

相关文章

C题(六) 1到 100 的所有整数中出现多少个数字9

场景&#xff1a;编写程序数一下 1到 100 的所有整数中出现多少个数字9 控制循环的变量不可以随意改动&#xff01;&#xff01;&#xff01; 控制循环的变量不可以随意改动&#xff01;&#xff01;&#xff01; 控制循环的变量不可以随意改动&#xff01;&#xff01;&#x…

【PyCharm】Ubuntu20.04 卸载 PyCharm 并安装激活 Professional

【PyCharm】Ubuntu20.04 卸载 PyCharm 并安装激活 Professional 1 卸载2 安装激活 1 卸载 参考文档: Link 删除安装目录 删掉之前压缩包解压出来的目录&#xff0c;例如&#xff1a;我之前是放在家目录下 rm -rf ~/pycharm-community-2023.2.1删除配置文件 rm -rf ~/.config…

JAVA运用中springBoot获取前端ajax提交参数方式汇总

本篇文章主要讲解springboot获取前端提交的参数信息&#xff0c;后端进行接受的常见方法汇总&#xff0c;通过本篇文章你可以快速掌握对表单和连接参数获取的能力。 作者&#xff1a;任聪聪 日期&#xff1a;2024年10月5日 一、delete、get等url参数获取方式 前台提交&#xf…

linux下yum安装时出现Loaded plugins: fastestmirror的解决办法

一、centos7修改源 在CentOS 7中&#xff0c;修改系统软件源可以通过编辑/etc/yum.repos.d/目录下的.repo文件来实现。以下是一个基本的步骤和示例代码&#xff0c;用于将默认的软件源修改为阿里云的源。 备份当前的CentOS-Base.repo文件&#xff1a; sudo cp /etc/yum.repos.…

使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

【可视化大屏】echarts介绍

使用echarts的步骤&#xff1a; 1.下载并引用echarts.js文件 2.准备一个具体宽高的容器 3.初始化echarts实例对象 // 实例化对象var myChart echarts.init(document.querySelector(".bar .chart"));4.指定配置项和数据 // 指定配置和数据var option {color: [&qu…

系统架构设计师⑥:知识产权与标准化

系统架构设计师⑥&#xff1a;知识产权与标准化 知识产权保护的范围与对象 知识产权保护期限 知识产权人确定 侵权判定 中国公民、法人或者其他组织的作品&#xff0c;不论是否发表&#xff0c;都享有著作权。 开发软件所用的思想、处理过程、操作方法或者数学概念不受保护。 …

信号检测理论(Signal Detection Theory, SDT)

信号检测理论&#xff08;Signal Detection Theory, SDT&#xff09;模拟是一种实验设计&#xff0c;用于研究和理解在存在噪声或不确定性的情况下如何做出决策。在心理学、认知科学、工程学和许多其他领域&#xff0c;信号检测理论都非常重要。 一、基础概念&#xff1a; 在信…

Mac ToDesk 无法连接网络

描述 网络连接的是 Wi-Fi&#xff0c;打开浏览器能跟正常浏览内容&#xff0c;说明 Wi-Fi 是正常的。 现象&#xff1a;显示网络连接失败&#xff0c;一直无法登陆&#xff01; 检查防火墙是没有阻止ToDesk 的任何连接&#xff0c;说明防火墙也是正常的。 解决 检查登录项&a…

3dsMax添加天空盒

点击渲染&#xff0c;环境 &#xff0c; 点击位图 找到要设置的天空HDR&#xff0c;可以使用HDR(EXR)贴图 一个可以下载HDR贴图的网站 https://polyhaven.com/hdris在渲染的时候不要使用使用微软输入法&#xff0c;3dsmax会卡死&#xff0c; 在渲染的时候不要使用使用微软…

胤娲科技:AI重塑会议——灵动未来,会议新纪元

你是否曾经历过这样的会议场景&#xff1a;会议纪要不准确&#xff0c;人名张冠李戴&#xff1b;错过会议&#xff0c;却无从回顾关键内容&#xff1b;会议效率低下&#xff0c;时间白白流逝&#xff1f; 这些问题仿佛成了现代会议的“顽疾”。然而&#xff0c;随着AI技术的飞速…

苹果荔枝柠檬梨柿子数据集 水果数据集 树上1500张 带标注 voc yolo 5类

苹果荔枝柠檬梨柿子数据集 水果数据集 树上1500张 带标注 voc yolo 5类 苹果荔枝柠檬梨柿子数据集 名称 苹果荔枝柠檬梨柿子数据集 (Apple, Litchi, Lemon, Pear, Persimmon Dataset) 规模 图像数量&#xff1a;1498张图像。类别&#xff1a;5种水果类别。标注个数&#xff…

linux基础指令的认识

在正式学习linux前&#xff0c;可以简单认识一下linux与win的区别 win&#xff1a;是图形界面&#xff0c;用户操作更简单&#xff1b;在刚开始win也是黑屏终端 指令操作&#xff0c;图形界面就是历史发展的结果。Linux&#xff1a;也存在图形界面比如desktop OS&#xff1b;但…

Redis实现点赞

部分实体类 TableId(value "id", type IdType.AUTO)private Long id;/*** 商户id*/private Long shopId;/*** 用户id*/private Long userId;/*** 用户图标*/TableField(exist false)private String icon;/*** 用户姓名*/TableField(exist false)private String …

lxml安装失败的一个解决方案

下载离线安装包&#xff0c;网址 https://pypi.org/simple/lxml/需要对应自己的python版本&#xff0c;网上教程很多&#xff0c;不再赘述 下载完成后将该文件&#xff0c;重命名&#xff08;下面是下载好的文件&#xff0c;上面是重命名的文件&#xff0c;就是在第二个版本&a…

【Linux】进程周边之优先级

目录 一、优先级 1.为什么要有进程优先级&#xff1f; 2.什么是进程优先级&#xff1f; 3.优先级的初始设定 3.1 PRI 和 NI 3.2如何修改优先级&#xff1f;&#xff08;sudo/root&#xff09; 3.2.1 概念&#xff1a; 3.2.2 如何查看进程的优先级&#xff1f; 3.3.3 或…

【深度学习】自动微分——Autodiff or Autograd?

论文 [1].CSC321 Lecture 10: Automatic Differentiation [2].Automatic Differentiation in Machine Learning:a Survey 关键点总结&#xff1a; 雅可比矩阵&#xff1a;对于多变量函数 y ⃗ f ( x ⃗ ) \vec{y} f(\vec{x}) y ​f(x )&#xff0c;其梯度矩阵&#xff08;…

GPT新功能Canvas!对普通用户最友好的功能!

原文链接&#xff1a;GPT4新功能Canvas!对普通用户最友好的功能&#xff01; ChatGPT更新了一个极度优雅&#xff0c;对普通人极度友好的功能。 而且&#xff0c;顺带&#xff0c;又碾死了一批AI赛道里&#xff0c;做AI文本编辑和Code Copilot的初创企业&#xff0c;一波端掉…

自动驾驶核心技术:感知融合、规划决策、控制执行

1、前言 简单来说&#xff0c;实现自动驾驶需要解决三个核心问题&#xff1a;“我在哪?我要去哪?我该如何去?”能完整解决这三个问题就是真正的自动驾驶。 目前&#xff0c;自动驾驶汽车关键技术主要包括环境感知、精准定位、决策与规划、控制与执行、高精地图与车联网V2X以…

ZYNQ:GPIO 之 MIO 按键中断实验

实验目的 使用底板上的 PS 端的用户按键 PS_KEY1 通过中断控制核心板上 LED2 的亮灭 简介 Zynq 芯片的 PS 部分是基于使用双核 Cortex-A9 处理器和 GIC pl390 中断控制器的 ARM 架构。中断结 构与 CPU 紧密链接&#xff0c;并接受来自 I/O 外设&#xff08;IOP&#xff09…