【优选算法篇】--深度解析之滑动窗口篇

news2025/3/18 20:09:13

滑动窗口

  • 一、长度最小的子数组
  • 二、无重复字符的最长子串
  • 三、最大连续1的个数III
  • 四、水果成篮

在这里插入图片描述

一、长度最小的子数组

长度最小的子数组
在这里插入图片描述

解析:

首先看到这题 我们首先想到的是暴力枚举,就是暴力枚举所有子数组和。时间复杂度是O(n^3)。

我们这里用解法二,利用单调性,使用“同向双指针”,(也叫滑动窗口)定义俩指针left right 让他们同向移动。left标记窗口的左区间,right标记窗口的右区间。首先进窗口,然后判断是否出窗口。
让右边的指针先走,走的过程要维护下窗口,用sum记录下每走一步的区间和。如果和小于target,我们就不出窗口(因为我们要找个最佳位置,也就是大于target位置)。大于target我们就出窗口(出窗口的时候我们要记录下此时窗口的长度,方便后续更新),出窗口left右移动,sum减去那个值,然后再判断。最后直到找到最小的长度。

草图如下:

在这里插入图片描述


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

        }
        return len==INT_MAX?0:len;
    }
};

二、无重复字符的最长子串

无重复字符的最长子串
在这里插入图片描述

解析:
看到求最长子串,我们可能首先会想到暴力枚举,枚举每一个字符 然后判断是否出现过,这里我们可以用到哈希表来判断是否出现过。但是暴力枚举的过程中,碰到一个重复字符,又得返回来。然而我们有个更优的解法。滑动窗口配上哈希表。

我们定义left,right等于起始位置,先进窗口(这里今后窗口意思就是让字符进入哈希表),一直向后走,走到某一个位置发现有重复的字符,那就让这个right先固定到这个位置不动,让left向后走,一直走到跳过跟right重复的字符(也就是出窗口,出窗口要让哈希表里的值减少)。然后这个right继续才能向后走,如果又碰到重复的字符,重复left指针操作(也就是继续向后移动, 走到跳过跟right相同的字符位置)


草图如下:

在这里插入图片描述


代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left=0,right=0,n=s.size();
        int hash[128]={0};//数组模拟哈希表,下表对应是字符,里面的值对应这个字符出现了多少次。
        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;
    }
};

三、最大连续1的个数III

最大连续1的个数

在这里插入图片描述

解法:
题目要求我们反转k个0,返回数组中连续1的最大个数。也就是将k个0翻转后,使得数组中连续1的个数最大。
其实我们可以将问题转换下,转换成找最长子数组,0的个数不超过K个。返回结果就是这个子数组长度。

我们在解题过程中,要注意进窗口,出窗口。我们right向右走的时候,如果zero(记录区间0的个数)大于k,left向右走,走到哪里呢,走到0的位置此时zero–,也就是出窗口。此时记录下区间长度。继续循环,直到找到最长子数组。

在这里插入图片描述

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int ret=0;
        for(int left=0,right=0,zero=0;right<nums.size();right++)
        {
            if(nums[right]==0)  zero++;//进窗口
            while(zero>k)//判断
                if(nums[left++]==0)//出窗口,left碰见0,--;
                    zero--;
            ret=max(ret,right-left+1);
        }
        return ret;
    }
};

四、水果成篮

水果成蓝
题目描述:
你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。

  • 你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:
  • 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
  • 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
  • 一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。
    给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。

在这里插入图片描述
解析:

  • 题目意思其实就是找一块连续最长子数组,里面字多两种水果。顾名思义,其实就是,找一块最长子数组,里面数字的类型不超过两种。

  • 这里讲解下思路。使用滑动窗口,配上哈希表。就能解决问题。left 和 right 分别表示满足要求的窗口的左右边界,同时我们使用哈希表存储这个窗口内的数种类以及出现的次数。

  • 我们每次将 right 移动一个位置,并将 fruits[right] 加入哈希表,加入过程中如果使得哈希表长度大于2,说明这个窗口里面数字的类型超过了两种,此时我们就要出窗口,判断操作。出窗口fruits[left]移除。需要注意的是,将 fruits[left] 从哈希表中移除后,如果 fruits[left] 在哈希表中的出现次数减少为 0,需要将对应的键值对从哈希表中移除。

  • 什么意思呢,我们以下面这张图里面的示例为例说明下吧,如果我们走到3,窗口里已经尝过了两种,此时我们left向后走,走到不出现1的位置,也就是标红色的地方。1这个数字就没有了,我们需要将它从哈希表中移除,也就是erase。


草图如下:
在这里插入图片描述


代码:

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        unordered_map<int,int>hash;//<种类,数量>
        int ret=0,left=0,right=0,n=fruits.size();
        while(right<n)
        {
            hash[fruits[right]]++;//进窗口
            //判断,出窗口
            while(hash.size()>2)
            {
                hash[fruits[left]]--;
                //得判断下,因为水果种类超过了俩个,left向后移动得删除一个种类
                if(hash[fruits[left]]==0)
                {
                    hash.erase(fruits[left]);
                }
                left++;
            }
            ret=max(ret,right-left+1);
            right++;
        }
        return ret;
    }
};

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

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

相关文章

[STM32]新建工程||一个工程文件应该有哪些基本内容?

目录 一 、开发方法 1.直接使用程序来配置寄存器 2.基于库函数的方式 3.基于HAL库的方式 二 、常规的工程文件分类 STM32芯片型号分类以及缩写 ​三 步骤总结 四 工程架构 五 调用外设基本通用步骤 一 、开发方法 1.直接使用程序来配置寄存器 底层&#xff0c;直接&…

python编写的一个打砖块小游戏

游戏介绍 打砖块是一款经典的街机游戏&#xff0c;玩家控制底部的挡板&#xff0c;使球反弹以击碎上方的砖块。当球击中砖块时&#xff0c;砖块消失&#xff0c;球反弹&#xff1b;若球碰到挡板&#xff0c;则改变方向继续运动&#xff1b;若球掉出屏幕底部&#xff0c;玩家失…

【菜鸟飞】通过vsCode用python访问公网deepseek-r1等模型(Tocken模式)

目标 通过vsCode用python访问deepseek。 环境准备 没有环境的&#xff0c;vscode环境准备请参考之前的文章&#xff0c;另外需安装ollama&#xff1a; 【菜鸟飞】用vsCode搭建python运行环境-CSDN博客 AI入门1&#xff1a;AI模型管家婆ollama的安装和使用-CSDN博客 选读文章…

Figma介绍(基于云的协作式界面设计工具,主要用于UI/UX设计、原型制作和团队协作)

文章目录 注册和登录简单操作说明Figma介绍**核心特点**1. **云端协作与实时同步**2. **跨平台兼容**3. **高效设计工具**4. **原型交互与动效**5. **开发对接友好**6. **插件生态**7. **版本控制与历史记录** **适用场景**- **团队协作**&#xff1a;远程团队共同设计、评审、…

Text-to-SQL将自然语言转换为数据库查询语句

有关Text-To-SQL方法&#xff0c;可以查阅我的另一篇文章&#xff0c;Text-to-SQL方法研究 直接与数据库对话-text2sql Text2sql就是把文本转换为sql语言&#xff0c;这段时间公司有这方面的需求&#xff0c;调研了一下市面上text2sql的方法&#xff0c;比如阿里的Chat2DB,麻…

XSS漏洞靶场---(复现)

XSS漏洞靶场—&#xff08;复现&#xff09; 反射型 XSS 的特点是攻击者诱导用户点击包含恶意脚本的 URL&#xff0c;服务器接收到请求后将恶意脚本反射回响应页面&#xff0c;浏览器执行该脚本从而造成攻击&#xff0c;恶意脚本不会在服务器端存储。 Level 1(反射型XSS) 此漏…

基于ssm的电子病历系统(全套)

一、系统架构 前端&#xff1a;jsp | bootstrap | jquery 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | tomcat | idea 二、代码及数据库 三、功能介绍 01. 登录 02. 主页 03. 管理员-个人中心-修改密码…

Linux-数据结构-线性表-单链表

一.链表的概念 【1】线性表的链式存储 解决顺序存储的缺点&#xff0c;插入和删除&#xff0c;动态存储问题。 【2】特点&#xff1a; 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存…

基于SpringBoot的Mybatis和纯MyBatis项目搭建的区别

【由于之前学习MyBatis的时候是跟着视频敲的纯MyBatis项目&#xff0c;以至于在突然看到别人在SpringBoot项目里搭建MyBatis方式的时候很懵比…特此文字形式记录一下区别&#xff08;应该还有好多种其他方式是我不知道的&#xff0c;主要应该就是要知道关键的流程步骤&#xff…

大数据学习(68)- Flink和Spark Streaming

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

Fastdata极数:中国民宿行业发展趋势报告2025

2024年&#xff0c;中国游客出行次数大幅上涨&#xff0c;旅游相关支出也复苏强劲。2025年中国旅游业还将持续稳健的复苏及增长。同时&#xff0c;中国旅游业将见证一场深刻的变革&#xff0c;这场变革的推动力是消费者对旅游期望的转变&#xff0c;经济因素和年轻人全新价值观…

图论——广度优先搜索实现

99. 岛屿数量 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述 第一行包含两个整数 N, M,表示矩阵的行数和列数。 后续 N 行,每行…

鸿蒙路由 HMrouter 配置及使用一

1、学习链接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下载安装 ohpm install hadss/hmrouter 添加编译插件配置 在工程目录下的build-profile.json5中&#xff0c;配置useNormalizedOHMUrl属性为true (我这项目创…

各省水资源平台 水资源遥测终端机都用什么协议

各个省水资源平台 水资源遥测终端机 的建设大部分从2012年开始启动&#xff0c;经过多年建设&#xff0c;基本都已经形成了稳定的通讯要求&#xff1b;河北瑾航科技 遥测终端机&#xff0c;兼容了大部分省市的通讯协议&#xff0c;如果需要&#xff0c;可以咨询和互相学习&…

需求分析、定义、验证、变更、跟踪(高软47)

系列文章目录 需求分析、定义、验证、变更、跟踪 文章目录 系列文章目录前言一、需求分析二、需求定义三、需求验证四、需求变更五、需求跟踪六、真题总结 前言 本节讲明需求分析、定义、验证、变更、跟踪相关知识。 一、需求分析 二、需求定义 三、需求验证 四、需求变更 五、…

从零开始 | C语言基础刷题DAY3

❤个人主页&#xff1a;折枝寄北的博客 目录 1.打印3的倍数的数2.从大到小输出3. 打印素数4.打印闰年5.最大公约数 1.打印3的倍数的数 题目&#xff1a; 写一个代码打印1-100之间所有3的倍数的数字 代码&#xff1a; int main(){int i 0;for (i 1; i < 100; i){if (i % …

docker入门篇

使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台&#xff0c;它可以让开发者将应用程序及其依赖打包到一个容器中&#xff0c;然后在任何环境中运行这个容器&#xff0…

Unity Shader - UI Sprite Shader之简单抠图效果

Sprite抠图效果&#xff1a; 前言 在PhotoShop中我们经常会用到抠图操作&#xff0c;现在就用Shader实现一个简单的抠图效果。 实现原理&#xff1a; 使用当前像素颜色与需要抠掉的颜色相减作比较&#xff0c;然后与一个指定的阈值比较以决定是否将其显示出来&#xff1b; U…

vllm-openai多服务器集群部署AI模型

服务器配置是两台ubantu系统电脑,每台电脑安装两张4090-48G显存的显卡,共计192G显存。 服务器1 服务器2 准备工作: 1.两台电脑都已经安装了docker 2.两台电脑都已经安装了nvidia驱动 参考vllm官方资料 https://docs.vllm.ai/en/latest/serving/distributed_serving.html…

在Spring Boot项目中接入DeepSeek深度求索,感觉笨笨的呢

文章目录 引言1. 什么是DeepSeek&#xff1f;2. 准备工作2.1 注册DeepSeek账号 3.实战演示3.1 application增加DS配置3.2 编写service3.3 编写controller3.4 编写前端界面chat.html3.5 测试 总结 引言 在当今快速发展的数据驱动时代&#xff0c;企业越来越重视数据的价值。为了…