算法专题二: 滑动窗口

目录

  • 1. 长度最小的子数组
  • 2. 无重复字符的最长子串
  • 3. 最大连续1的格数Ⅲ
  • 4. 将x减到0的最小操作数
  • 5. 水果成篮
  • 6. 找到字符串中所有字母异位词
  • 7. 串联所有单词的子串
  • 8. 最小覆盖子串

1. 长度最小的子数组

在这里插入图片描述

题目思路:

首先暴力解法就是依次枚举出所有的子数组, 从第一个元素为左端点依次向后枚举, 枚举到长度大于target就停止枚举, 以第二个元素为左端点进行枚举, 这里我们可以进行优化.

滑动窗口解法, 定义两个下标, left先从第一个元素位置开始, right找右端点, 如果找到了此时right也不需再回到第二个元素开始, 和left一起向后走, 因为我们已经计算出right- left这段区间的和了, 只需要减去第一个元素即可枚举下一个数组, 并且right前一个元素与前面元素之和我们已经知道一定是小于target的, 所以直接left++即可, 这种场景就像在维持一个滑动窗口一样, 同向双指针, 按照以下步骤我们进行编写代码.

在这里插入图片描述

编写代码:

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int sum = 0, ret = INT_MAX;for(int left = 0,right = 0; right<nums.size();right++){sum += nums[right];while(sum >= target){ret = min(ret,(right - left +1));sum -= nums[left++];}}return ret == INT_MAX ? 0 : ret;}
};

2. 无重复字符的最长子串

在这里插入图片描述

题目思路:

首先看到求子串子数组, 我们首先可以想到滑动窗口, 但是怎么判断不重复呢, 我们可以利用哈希, 但是没必要使用容器, 因为字符范围我们已经知道了, 所以自己创建一个, 进窗口, 就是把每个字符扔到哈希表里, 判断条件就是是否重复, 如果重复, 那就出窗口进行下一次判断, 最后判断结束之后更新结果.

编写代码:

class Solution {
public:int lengthOfLongestSubstring(string s) {int hash[128] = {0},ret = 0;for(int left = 0, right = 0; right < s.size(); right++){hash[s[right]]++;while(hash[s[right]] == 2){hash[s[left]]--;left++;}ret = max(ret, (right - left +1));}return ret;}
};

3. 最大连续1的格数Ⅲ

在这里插入图片描述

题目思路:

寻找最大连续1的个数, 进窗口, 如果是1, 无视, 如果是0 ,则计数器加1, 当计数器大于k时, 开始判断然后出窗口, 最后更新结果.

在这里插入图片描述

编写代码:

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

4. 将x减到0的最小操作数

在这里插入图片描述

题目思路:

采用正难则反的思想, 转化为找出最长子数组的长度, 所有元素之和正好等于sum- x即可, 然后进行滑动窗口求解, 最后更新结果时需要判断.

在这里插入图片描述

编写代码:

class Solution {
public:int minOperations(vector<int>& nums, int x) {int sum = 0, ret = -1;for(const auto& e : nums) sum+=e;int target = sum - x;if(target < 0) return -1;int tmp = 0;for(int left = 0, right = 0; right  < nums.size(); right++){tmp += nums[right];while(tmp > target){tmp -= nums[left];left++;}if(target == tmp)ret = max(ret, (right - left + 1));}if(ret == -1) return ret;else return nums.size() - ret;}
};

5. 水果成篮

在这里插入图片描述

题目思路:

采用暴力解法会超时, 我们采用滑动窗口解法, 定义kinds表示篮子的个数, 每次采摘水果之后将水果扔到哈希表中, 判断条件为如果种类大于2则出窗口, 并且把水果出哈希表, 进行下一次判断. 最后更新结果.

在这里插入图片描述

编写代码:

class Solution {
public:int totalFruit(vector<int>& f) {int hash[100001] = {0}, count = 0, ret = 0;for(int left = 0, right = 0; right < f.size(); right++){if(hash[f[right]]++ == 0) count++;while(count > 2){if(--hash[f[left++]] == 0) count--;}ret = max(ret,(right - left +1));}return ret;}
};

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

在这里插入图片描述

题目思路:

利用哈希表进行判断是否时异位词, 如果出现的次数都一样则为异位词, 利用变量count来记录有效字符的个数, 条件是, 进入哈希表之后判断 hash2[in] <= hash1[in] 是否成立, 如果成立则count++, 然后进行单次判断, 因为这里窗口大小一定是固定大小的, 所以判断长度是否合法,然后出窗口, 出窗口之前一样先更新count, 最后判断如果count等于p的长度则更新结果.
在这里插入图片描述

编写代码:

class Solution {
public:vector<int> findAnagrams(string s, string p) {int hash1[26] = {0}, hash2[26] = {0};vector<int> v;for(const auto& ch : p) hash1[ch - 'a']++;for(int left = 0,right = 0,count = 0; right < s.size(); 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()) v.push_back(left);}return v;}
};

7. 串联所有单词的子串

在这里插入图片描述

题目思路:

这道题与上一道题的解法非常的类似, 只不过这里判断是字符串, 这里我们采用容器哈希表来求解, 移动的步长是单词的长度, 滑动窗口执行的次数为len.

在这里插入图片描述

编写代码:

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {unordered_map<string,int> hash1;vector<int> ret;for(const auto& s : words) hash1[s]++;size_t len = words[0].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);if(hash1.count(in) && ++hash2[in] <= hash1[in]) count++;if((right - left + 1) > words.size() * len){string out = s.substr(left, len);if(hash1.count(out) && hash2[out]-- <= hash1[out]) count--;left+=len;}if(count == words.size()) ret.push_back(left);}}return ret;}
};

8. 最小覆盖子串

在这里插入图片描述

题目思路:

寻找最小覆盖的子串, 这里有可能子串中存在多个t中的字符, 所以我们需要统计种类, 也就是有效个数的种类, 只有当hash1[in] == hash2[in]时, 我们才算做一次有效字符.

在这里插入图片描述

编写代码:

class Solution {
public:string minWindow(string s, string t) {int hash1[128] = {0}; int kids = 0;for(const auto& ch : t)if(hash1[ch]++ == 0) kids++;int hash2[128] = {0};int begin = -1,len = INT_MAX;for(int left = 0, right = 0, count = 0; right < s.size(); right++){//进窗口+维护if(++hash2[s[right]] == hash1[s[right]]) count++;while(count == kids){if (right - left + 1 < len){begin = left;len = right - left + 1;}if(hash2[s[left]]-- == hash1[s[left]]) count--;hash2[s[left++]];}}if(begin == -1) return "";else return s.substr(begin,len);}
};

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

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

相关文章

婚恋交友小程序的设计思路与用户体验优化

在数字化时代&#xff0c;婚恋小程序作为一种新兴的婚恋交友平台&#xff0c;正逐渐成为单身人士寻找伴侣的重要工具。一个优秀的婚恋小程序不仅要有创新的设计思路&#xff0c;还要注重用户体验的优化。编辑h17711347205以下是婚恋小程序的设计思路与用户体验优化的详细阐述&a…

ELK--收集日志demo

ELK--收集日志demo 安装ELK日志收集配置启动容器springboot配置测试 之前项目多实例部署的时候&#xff0c;由于请求被负载到任意节点&#xff0c;所以查看日志是开多个终端窗口。后来做了简单处理&#xff0c;将同一项目的多实例日志存入同一个文件&#xff0c;由于存在文件锁…

景联文科技精准数据标注:优化智能标注平台,打造智能未来

景联文科技是一家致力于为人工智能提供全面数据标注解决方案的专业公司。 拥有一支由经验丰富的数据标注师和垂直领域专家组成的团队&#xff0c;确保数据标注的质量和专业性。 自建平台功能一站式服务平台&#xff0c;提供从数据上传、标注、审核到导出的一站式服务&#xff0…

【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 timer驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "timer.h"int main(void) {H…

【LeetCode HOT 100】详细题解之链表篇

LeetCode HOT 100题解之链表篇 160 相交链表题目分析代码 206 反转链表方法一&#xff1a;迭代 234 回文链表方法一&#xff1a;将值复制到数组中方法二&#xff1a;快慢指针 141 环形链表方法一&#xff1a;哈希表方法二&#xff1a;快慢指针 142 环形链表II方法一&#xff1a…

<<机器学习实战>>10-11节笔记:生成器与线性回归手动实现

10生成器与python实现 如果是曲线规律的数据集&#xff0c;则需要把模型变复杂。如果是噪音较大&#xff0c;则需要做特征工程。 随机种子的知识点补充&#xff1a; 根据不同库中的随机过程&#xff0c;需要用对应的随机种子&#xff1a; 比如 llist(range(5)) random.shuf…

鸿蒙NEXT开发环境搭建(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南

使用 SSH 连接 Docker 服务器&#xff1a;IntelliJ IDEA 高效配置与操作指南 本文详细介绍了如何在 2375 端口未开放的情况下&#xff0c;通过 SSH 连接 Docker 服务器并在 Idea 中进行开发。通过修改用户权限、生成密钥对以及配置 SSH 访问&#xff0c;用户可以安全地远程操作…

python画图|自制渐变柱状图

在前述学习过程中&#xff0c;我们已经通过官网学习了如何绘制渐变的柱状图及其背景。 掌握一门技能的最佳检验方式就是通过实战&#xff0c;因此&#xff0c;本文尝试做一些渐变设计。 前述学习记录可查看链接&#xff1a; Python画图|渐变背景-CSDN博客 【1】柱状图渐变 …

Mac制作Linux操作系统启动盘

前期准备 一个 Mac 电脑 一个 U 盘&#xff08;8GB 以上&#xff09; 下载好 Linux 系统镜像&#xff08;iso 文件&#xff09; 具体步骤 挂载 U 盘 解挂 U 盘 写系统镜像到 U 盘 完成 一、挂载 U 盘 首先插入 U 盘&#xff0c;打开终端输入下面的命令查看 U 盘是否已经 m…

Springboot3 + MyBatis-Plus + MySql + Vue + ProTable + TS 实现后台管理商品分类(最新教程附源码)

Springboot3 MyBatis-Plus MySql Uniapp 商品加入购物车功能实现&#xff08;针对上一篇sku&#xff09; 1、效果展示2、数据库设计3、后端源码3.1 application.yml 方便 AliOssUtil.java 读取3.2 model 层3.2.1 BaseEntity3.2.1 GoodsType3.2.3 GoodsTypeSonVo3.3 Controll…

24 Vue3之集成TailwindCSS

Tailwind CSS Tailwind CSS是一个由js编写的CSS 框架 他是基于postCss 去解析的 官网地址Tailwind CSS 中文文档 - Tailwind CSS - 只需书写 HTML 代码&#xff0c;无需书写 CSS&#xff0c;即可快速构建美观的网站。 | TailwindCSS中文文档 | TailwindCSS中文网 对于PostCSS…

使用root账号ssh登录虚拟机ubuntu

在C:\Users\Administrator\.ssh目录下的config中&#xff0c;添加ubuntu会在根目录中&#xff0c;建立一个root文件夹。在该文件夹中建一个.ssh目录。像免密登录ubuntu设置中&#xff0c;把公钥考进去。在vscode中打开文件夹中选择要打开的文件夹&#xff0c;就可以不需要在ubu…

CentOS7 离线部署docker和docker-compose环境

一、Docker 离线安装 1. 下载docker tar.gz包 下载地址&#xff1a; Index of linux/static/stable/x86_64/ 本文选择版本&#xff1a;23.0.6 2.创建docker.service文件 vi docker.service文件内容如下&#xff1a; [Unit] DescriptionDocker Application Container Engi…

【成神之路】Ambari实战-014-代码生命周期-metainfo-cardinality详解

1.Redis 集群 metainfo.xml 示例 <?xml version"1.0"?> <metainfo><schemaVersion>2.0</schemaVersion><services><service><!-- Redis 集群服务的基本信息 --><name>REDIS</name><displayName>Redi…

Redis的基础认识与在ubuntu上的安装教程

来自Redis的自我介绍 我是Redis&#xff0c;一个中间件&#xff0c;职责是把数据存储在内存上&#xff0c;因此可以作为数据库、缓存、消息队列等场景使用。由于可以把数据存储在内存上&#xff0c;因此江湖人称快枪手 1.redis的功能特性 &#xff08;1&#xff09;数据在内存…

制造企业各部门如何参与生产成本控制与管理?

​国内制造业的分量可不轻&#xff0c;从日常生活用品到高端工业设备&#xff0c;中国制造几乎涵盖了各个领域。 不过很多制造业企业在管理方面确实存在一些难题&#xff1a;成本控制不容易&#xff0c;产品质量并不稳定&#xff0c;生产周期也常常较长。 一、中国制造业生产管…

【ZYNQ 开发】填坑!双核数据采集系统LWIP TCP发送,运行一段时间不再发送且无法ping通的问题解决

问题描述 之所以说是填坑&#xff0c;是因为之前写了一篇关于这个双核数据采集系统的调试记录&#xff0c;问题的具体表现是系统会在运行一段时间后&#xff08;随机不定时&#xff0c;长了可能将近两小时&#xff0c;短则几分钟&#xff09;&#xff0c;突然间就不向电脑发送数…

《家庭无线网络覆盖项目》

家庭无线网络覆盖报项目 目录 家庭无线网络覆盖项目 家庭无线网络覆盖项目 一、项目概述 二、设备清单及报价 三、安装调试费用 四、总报价 五、服务承诺 家庭无线网络覆盖项目 客户姓名:[客户姓名] 联系方式:[电话号码] 家庭地址:[详细地址] 一、项目概述 为客户…

docker compose 容器编排

文章目录 1、docker compose简介2、下载与安装2.1、创建指定目录存储docker compose2.2、下载docker-compose并移动到上面的目录下2.3、给docker-compose文件赋予可执行权限2.4、查看docker compose的版本 3、入门案例&#xff08;使用docker compose部署redis&#xff09;3.1、…