算法 —— 滑动窗口
目录
长度最小的子数组
无重复字符的最长子串
最大连续1的个数
将x减到0的最小操作数
找到字符串中所有字母异位词
最小覆盖子串
长度最小的子数组
sum比target小就进窗口,sum比target大就出窗口,由于数组是正数,所以相加会使sum变大,相减会使sum变小,至于为什么可以这样做,这其实是在暴力枚举的基础上进行了优化,例如2,3,1,2相加等于8已经超过target,这样就不需要继续加后面的4,3,因为此时已经满足条件,我们要做的是在满足要求的基础上使len尽量小。
代码实现如下:
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int sum = 0, len = INT_MAX, n = nums.size();for (int right = 0, left = 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;}
};
无重复字符的最长子串
利用哈希表记录字符个数,注意本题字符包括数字,字母及空格,意味着我们要开一个128大小的数组。代码实现如下:
class Solution {
public:int lengthOfLongestSubstring(string s) {int hash[128] = { 0 }; // 使用数组来模拟哈希表int n = s.size(), len = 0;for (int left = 0, right = 0; right < n;right++){hash[s[right]]++; // 进窗口while (hash[s[right]] == 2) // 判断{hash[s[left++]]--; // 出窗口}len = max(len, right - left + 1); // 更新结果}return len;}
};
最大连续1的个数
和上题类似,通过滑动窗口,调节0的个数,最关键的在于将题目意思转换为找不超过k个0的子数组,如果超过k就出窗口,未超过就进窗口,代码实现如下:
class Solution {
public:int longestOnes(vector<int>& nums, int k) {int zero = 0, len = 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++; // 出窗口}len = max(len, right - left + 1);}return len;}
};
将x减到0的最小操作数
本题思想为正难则反,如果题目正向思考困难,可以从另外一方面思考,例如本题要找最短长度,且元素可能在左右端口出现,另外最短长度数组元素之和刚好为x,这个代码实现起来过于麻烦,可以想找一个最长长度的子数组,使他元素之和刚好为sum - x,这样又转化为滑动窗口问题。
注意:len不能设置为0,因为有可能整个数组都是构成x的元素,最终判断是否存在时不能用len == 0 这个判断式来判断数组是否存在子数组可以将x减到0,应当设置为-1。另外,该题只有在sum2 == target时才能更新结果,否则不更新。代码如下:
class Solution {
public:int minOperations(vector<int>& nums, int x) {// 记算整个数组的和int sum1 = 0, n = nums.size();for (auto e : nums){sum1 += e;}// 找出最长子数组的和 sum1 - xint target = sum1 - x, len = -1, sum2 = 0;// 处理细节问题if (target < 0)return -1;// 滑动窗口解决问题for (int left = 0, right = 0; right < n; right++){sum2 += nums[right]; // 进窗口while (sum2 > target) // 判断sum2 -= nums[left++]; // 出窗口if (sum2 == target)len = max(len, right - left + 1); // 更新结果}if (len == -1)return len;elsereturn n - len;}
};
找到字符串中所有字母异位词
在更新结果时不需要遍历两个哈希表,通过count计数器来判断hash2里的有效个数是否和m相等即可,代码实现如下:
class Solution {
public:vector<int> findAnagrams(string s, string p) {int hash1[26] = { 0 }, hash2[26] = { 0 }, n = s.size(), m = p.size();// 统计 p 的每个字符出现的次数for (auto e : p)hash1[e - 'a']++;vector<int> ret;// 统计 s 的每个字符出现的次数for (int left = 0, right = 0,count = 0; right < n; right++){char in = s[right];if (++hash2[in - 'a'] <= hash1[in - 'a']) // 进窗口 + 维护 countcount++;if (right - left + 1 > m) // 判断{char out = s[left++];if (hash2[out - 'a']-- <= hash1[out - 'a']) // 出窗口 + 维护 countcount--;}// 更新结果if (count == m)ret.push_back(left);}return ret;}
};
最小覆盖子串
class Solution {
public:string minWindow(string s, string t) {int hash1[128] = { 0 }, hash2[128] = { 0 };int hash1_kinds = 0;for (auto e : t)if (hash1[e]++ == 0) hash1_kinds++; // 记录子串字母种类int begin = -1, minlen = INT_MAX;for (int left = 0, right = 0,count = 0;right < s.size();right++){char in = s[right];if (++hash2[in] == hash1[in])count++; // 进窗口while (count == hash1_kinds) // 判断条件{char out = s[left];if (right - left + 1 < minlen) // 更新结果{begin = left; minlen = min(right - left + 1, minlen);}if (hash2[out]-- == hash1[out])count--; // 出窗口left++;}}if (begin == -1)return "";elsereturn s.substr(begin, minlen);}
};
相关文章:

算法 —— 滑动窗口
目录 长度最小的子数组 无重复字符的最长子串 最大连续1的个数 将x减到0的最小操作数 找到字符串中所有字母异位词 最小覆盖子串 长度最小的子数组 sum比target小就进窗口,sum比target大就出窗口,由于数组是正数,所以相加会使sum变大&…...

【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
文章目录 定义简单工厂模式案例 | 代码Phone顶层接口设计Meizu品牌类Xiaomi品牌类PhoneFactory工厂类Customer 消费者类 工厂方法模式案例 | 代码PhoneFactory工厂类 Java高级特性---工厂模式与反射的高阶玩法方案:反射工厂模式 总结 其实工厂模式就是用一个代理类帮…...
Linux之计划和日志
计划任务 计划任务概念解析 在Linux操作系统中,除了用户即时执行的命令操作以外,还可以配置在指定的时间、指定的日期执行预先计划好的系统管理任务(如定期备份、定期采集监测数据)。通过安装at和crontabs这两个系统服务实现一次性、周期性计划任务的功能,并分别通过at、…...

C++ 多态篇
文章目录 1. 多态的概念和实现1.1 概念1.2 实现1.2.1 协变1.2.2 析构函数1.2.3 子类虚函数不加virtual 2. C11 final和override3.1 final3.2 override 3. 函数重载、重写与隐藏4. 多态的原理5. 抽象类6.单继承和多继承的虚表6.1 单继承6.2 多继承 7. 菱形继承的虚表(了解)7.1 菱…...

【LVGL-SquareLine Studio】
LVGL-SquareLine Studio ■ SquareLine Studio-官网下载地址■ SquareLine Studio-参考博客■ SquareLine Studio-安装■ SquareLine Studio-汉化■ SquareLine Studio-■ SquareLine Studio-■ SquareLine Studio-■ SquareLine Studio-■ SquareLine Studio- ■ SquareLine S…...
mysqli 与mysql 区别和联系, 举例说明
mysqli是一种PHP的扩展,用于与MySQL数据库进行交互。它提供了一套面向对象的接口,可以更方便地操作数据库。MySQL是一种关系型数据库管理系统,用于存储和管理数据。 区别: mysqli是MySQL的扩展,而不是单独的数据库管…...

【SpringCloud应用框架】Nacos安装和服务提供者注册
第二章 Spring Cloud Alibaba Nacos之Nacos安装和服务提供者注册 文章目录 Nacos介绍为何使用Nacos?一、Nacos下载和安装1. 下载2. 安装Linux/Unix/MacWindows 二、Nacos服务提供者注册1. Nacos代替Eureka2. Nacos服务注册中心3. 引入Nacos Discovery进行服务注册/发…...

英语学习交流小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,每日打卡管理,备忘录管理,学习计划管理,学习资源管理,论坛交流 微信端账号功能包括:系统首页,学习资源&…...
实现Java多线程中的线程间通信
实现Java多线程中的线程间通信 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 线程间通信的基本概念 在线程编程中,线程间通信是指多个线程之间通过共享内存或消息传递的方式进行交…...

C++模板元编程(一)——可变参数模板
这个系列主要记录C模板元编程的常用语法 文章目录 引言语法应用函数模板可变参数的打印可变参数的最小/最大函数 类模板 参考文献 引言 在C11之前,函数模板和类模板只支持含有固定数量的模板参数。C11增强了模板功能,允许模板定义中包含任意个(包括0个)…...

kafka中
Kafka RocketMQ概述 RabbitMQ概述 ActiveMQ概述 ZeroMQ概述 MQ对比选型 适用场景-从公司基础建设力量角度出发 适用场景-从业务场景出发 Kafka配置介绍 运行Kafka 安装ELAK 配置EFAK EFAK界面 KAFKA常用术语 Kafka常用指令 Kafka中消息读取 单播消息 group.id 相同 多播消息 g…...
Android 获取当前电池状态
在 API 级别 23 上获取充电状态 要在 API 级别 23 上获取电池的当前状态,只需使用电池管理器系统服务: BatteryManager batteryManager (BatteryManager) getSystemService(BATTERY_SERVICE); boolean isCharging batteryManager.isCharging();使用 S…...

【JVM 的内存模型】
1. JVM内存模型 下图为JVM内存结构模型: 两种执行方式: 解释执行:JVM是由C语言编写的,其中有C解释器,负责先将Java语言解释翻译为C语言。缺点是经过一次JVM翻译,速度慢一点。JIT执行:JIT编译器…...

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01—短信/邮件/异常/MD5
持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01 环境搭建验证码倒计时短信服务邮件服务验证码短信形式:邮件形式: 异常机制MD5参考 环境搭建 C:\Windows\System32\drivers\etc\hosts 192.168.…...
geom buffer制作
1. auto buffer_geom line_string->buffer(15);//buffer //这个是x和y各扩大段15个单位 auto buffer_geom line_string->buffer(15);//buffer //这个是x和y各扩大段15米 获取buffer坐标 auto boundary buffer_geom->getBoundary(); auto boundary_coords boun…...

微软正在放弃React
最近,微软Edge团队撰写了一篇文章,介绍了微软团队如何努力提升Edge浏览器的性能。但在文中,微软对React提出了批评,并宣布他们将不再在Edge浏览器的开发中使用React。 我将详细解析他们的整篇文章内容,探讨这一决定对…...

U盘非安全退出后的格式化危机与高效恢复策略
在数字化时代,U盘作为数据存储与传输的重要工具,其数据安全备受关注。然而,一个常见的操作失误——U盘没有安全退出便直接拔出,随后再插入时却遭遇“需要格式化”的提示,这不仅让用户措手不及,更可能意味着…...

安卓虚拟位置修改
随着安卓系统的不断更新,确保软件和应用与最新系统版本的兼容性变得日益重要。本文档旨在指导用户如何在安卓14/15系统上使用特定的功能。 2. 系统兼容性更新 2.1 支持安卓14/15:更新了对安卓14/15版本的支持,确保了软件的兼容性。 2.2 路…...
大数据面试题之Presto[Trino](5)
目录 Presto的扩展性如何? Presto如何与Hadoop生态系统集成? Presto是否可以连接到NoSQL数据库? 如何使用Presto查询Kafka中的数据? Presto与Spark SQL相比有何优势和劣势? Presto如何与云服务集成࿱…...
对编程开发人员在今年的一些建议
一、今年的大环境 这几天身体不太好,又不断看到地狱级的就业问题。所以有些想法想和大家分享一下,并提出自己的一些想法和建议。今年的大环境不好,做为非专业人士,咱们也不分析,以免贻笑大方。但针对大环境下的计算机…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...