【LeetCode】力扣刷题热题100道(21-25题)附源码 接雨水 合并区间 字母异位词 滑动窗口 覆盖子串(C++)

目录

1.接雨水

2.合井区间

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

4.滑动窗口最大值

5.最小覆盖子串


1.接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

代码如下所示:

class Solution {
public:int trap(vector<int>& height) {int n = height.size();if (n == 0) return 0;int left = 0, right = n - 1;int left_max = 0, right_max = 0;int water = 0;while (left < right) {if (height[left] < height[right]) {if (height[left] >= left_max) {left_max = height[left]; // 更新左侧最大高度} else {water += left_max - height[left]; // 累加雨水}++left; // 左指针右移} else {if (height[right] >= right_max) {right_max = height[right]; // 更新右侧最大高度} else {water += right_max - height[right]; // 累加雨水}--right; // 右指针左移}}return water;}
};

利用两个指针分别从数组的两端向中间遍历。

同时维护两个变量:

left_max:从左侧当前最大高度。

right_max:从右侧当前最大高度。

计算能接的雨水:

如果 height[left] 小于等于 height[right],则 left 所在位置的最大雨水由 left_max - height[left] 决定,更新左指针。

如果 height[right] 小于 height[left],则 right 所在位置的最大雨水由 right_max - height[right] 决定,更新右指针。

继续移动指针,直到 left == right。

2.合井区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {// 按区间的起点进行排序sort(intervals.begin(), intervals.end());vector<vector<int>> merged;for (const auto& interval : intervals) {// 如果结果数组为空,或者当前区间与上一个区间不重叠,直接添加if (merged.empty() || merged.back()[1] < interval[0]) {merged.push_back(interval);} else {// 如果当前区间与上一个区间重叠,合并它们merged.back()[1] = max(merged.back()[1], interval[1]);}}return merged;}
};

将区间集合中所有重叠的区间合并成不重叠的区间集合。首先,通过对区间集合按起点升序排序,确保后续处理的区间是按顺序排列的;接着,使用一个结果数组 merged 存储最终的非重叠区间。遍历排序后的区间集合时,如果当前区间与结果数组最后一个区间不重叠,则直接将其加入结果数组;如果重叠,则通过更新终点为两者的较大值来合并区间。这种方法充分利用排序和遍历的性质,以线性方式逐步合并区间,最终返回一个不重叠的区间集合。

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

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

字母异位词,字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。

class Solution {
public:vector<int> findAnagrams(string s, string p) {vector<int> result;if (s.size() < p.size()) return result;// 记录 p 的字符频率vector<int> pCount(26, 0), sCount(26, 0);for (char c : p) {pCount[c - 'a']++;}// 初始化 s 中的滑动窗口for (int i = 0; i < p.size(); ++i) {sCount[s[i] - 'a']++;}// 检查初始窗口是否匹配if (sCount == pCount) {result.push_back(0);}// 滑动窗口遍历 sfor (int i = p.size(); i < s.size(); ++i) {// 添加右侧字符sCount[s[i] - 'a']++;// 移除左侧字符sCount[s[i - p.size()] - 'a']--;// 检查当前窗口是否匹配if (sCount == pCount) {result.push_back(i - p.size() + 1);}}return result;}
};

使用一个固定大小的窗口遍历字符串 s。

在每一步中,检查窗口内的字符计数是否与字符串 p 的字符计数匹配。

如果匹配,则记录当前窗口的起始索引。

使用两个计数器来高效地更新滑动窗口,避免重复计算。

字符计数:pCount 和 sCount 用于存储 p 和当前窗口的字符频率。每个频率数组大小为 26(对应字母 a-z)。

初始窗口设置:初始化 sCount 为 s 中前 p.size() 个字符的频率。

滑动窗口更新:

每次窗口向右滑动一个字符。

添加新字符到窗口中,同时移除窗口最左边的字符。窗口匹配检查:每次更新窗口后检查 sCount 是否等于 pCount,相等时记录窗口的起始索引。

4.滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;deque<int> dq; // 双端队列,用来存储窗口中元素的索引for (int i = 0; i < nums.size(); ++i) {// 移除不在窗口范围内的元素if (!dq.empty() && dq.front() < i - k + 1) {dq.pop_front();}// 移除所有小于当前元素的值,它们不可能成为窗口的最大值while (!dq.empty() && nums[dq.back()] < nums[i]) {dq.pop_back();}// 将当前元素的索引加入队列dq.push_back(i);// 窗口形成后(即 i >= k - 1),记录窗口的最大值if (i >= k - 1) {result.push_back(nums[dq.front()]);}}return result;}
};

双端队列维护窗口最大值:

双端队列存储的是元素的索引,而不是值。

保证队列中索引对应的值是递减的,从而队列头部始终是窗口内的最大值。

窗口的更新:

移除队列中不在当前窗口范围内的元素。

移除队列中所有小于当前值的元素,因为它们不可能成为当前窗口的最大值。

记录最大值:

每次移动窗口时,将队列头部的值(即当前窗口的最大值)加入结果。

双端队列的性质:

队列中的元素从头到尾递减。

队列头部始终是当前窗口的最大值。

滑动窗口逻辑:

当窗口左边界超出队列中最左边的索引时,移除队列头部。

插入新元素之前,移除队列中所有小于当前值的元素。

结果记录:当窗口的右边界到达 k−1k - 1k−1 或之后时,窗口形成,记录最大值。

5.最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。

class Solution {
public:string minWindow(string s, string t) {unordered_map<char, int> need, window;for (char c : t) need[c]++;int left = 0, right = 0;  // 滑动窗口的左右指针int valid = 0;           // 当前窗口中满足要求的字符数int start = 0, minLen = INT_MAX; // 最小子串的起始位置和长度while (right < s.size()) {char c = s[right]; // 即将移入窗口的字符right++;           // 扩大窗口// 如果当前字符是目标字符之一,则更新窗口内的数据if (need.count(c)) {window[c]++;if (window[c] == need[c]) valid++;}// 判断是否需要收缩窗口while (valid == need.size()) {// 更新最小子串if (right - left < minLen) {start = left;minLen = right - left;}char d = s[left]; // 即将移出窗口的字符left++;           // 缩小窗口// 更新窗口内的数据if (need.count(d)) {if (window[d] == need[d]) valid--;window[d]--;}}}// 如果找到了符合条件的子串,返回它;否则返回空字符串return minLen == INT_MAX ? "" : s.substr(start, minLen);}
};

使用两个指针表示滑动窗口的起始和结束位置。

用一个哈希表(need)记录字符串 t 中每个字符的频率,用另一个哈希表(window)记录当前窗口中每个字符的频率。

遍历字符串 s,调整窗口的大小:

当窗口中的字符已满足 t 的要求时,尝试收缩窗口。

每次收缩时检查窗口长度,并更新最小长度和起始位置。如果遍历完成后没有找到符合条件的子串,返回空字符串。

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

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

相关文章

ThreadLocal 的使用场景

在现代电商平台中&#xff0c;ThreadLocal 常用于以下场景&#xff0c;特别是与线程隔离相关的业务中&#xff0c;以提高性能和简化上下文传递。 1. 用户上下文信息管理 场景&#xff1a;在用户发起的每次请求中&#xff0c;需要携带用户 ID、角色、权限等信息&#xff0c;而这…

慧集通(DataLinkX)iPaaS集成平台-智能体(Agent)API

功能简介&#xff1a; 该功能下主要是用来管理集成平台对外开放接口得管控以及调用日志信息得查看操作&#xff0c;并支持日志得重放等操作&#xff1b;注&#xff1a;所有触发类单据得日志也可以在此查看(如使用数据触发组件自动触发流程得日志信息) 1.第三方调用接口类日志查…

如何 cURL Elasticsearch:进入 Shell

作者&#xff1a;来自 Elastic Philipp Krenn Kibana 的控制台是开始使用 Elasticsearch 的 REST API 的最简单方法 - 语法突出显示、自动完成、格式化、导出 cURL、JavaScript 或 Python。而且你不必担心正确的端点、身份验证等。但是有时&#xff0c;如果 Kibana 不可用、你…

HTB:Bank[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 提取出靶机TCP开放端口 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用curl对域名进行访问…

智能码二维码生成器zhinengma.cn如何助力生产行业进行高效管理

智能码二维码生成器zhinengma.cn可通过以下方式助力生产行业进行高效管理1&#xff1a; 设备管理 设备信息整合与查询&#xff1a;为每台生产设备生成专属二维码&#xff0c;将设备基本信息、技术参数、操作手册、历史维护记录等整合并关联到二维码上。维护人员在设备现场用手机…

前端批量下载文件

背景 文件管理页面&#xff0c;后端只提供了一个根据 file_path 和 file_name 参数下载文件的API接口。产品需要支持用户多选之后的批量下载功能。 技术实现 基础代码 先调用下载接口&#xff0c;获取到二进制的文件流&#xff0c;然后通过 a 标签完成下载。 // return [r…

创建基本的 Electron 应用项目的详细步骤

创建一个基本的 Electron 应用项目的详细步骤。我们将从安装 Node.js 开始&#xff0c;然后创建项目文件夹并初始化 Electron 项目。 1. 安装 Node.js 首先&#xff0c;确保你已经安装了 Node.js 和 npm。你可以在终端中运行以下命令来检查是否已经安装&#xff1a; node -v…

TDengine + MQTT :车联网时序数据库如何高效接入

现代新能源汽车&#xff0c;作为一种内部系统极为复杂的交通工具&#xff0c;配备了大量传感器、导航设备、应用软件&#xff0c;这些传感器产生的数据都需要上报到车联网平台当中。对于这些车辆的状态数据&#xff08;如车速、发动机转速等&#xff09;、位置数据&#xff08;…

2. Scala 高阶语法之集合与元组

背景 上一章简单介绍了scala是什么&#xff0c;以及scala的基础用法&#xff0c;本文介绍scala的高阶语法&#xff0c;希望看完本章之后&#xff0c;读者能体会到scala和java的明显区别&#xff0c;以及scala的强大之处。 1. 数组 Scala中提供了一种数据结构-数组&#xff0…

MDX语言的正则表达式

MDX语言中的正则表达式 引言 MDX&#xff08;Multidimensional Expressions&#xff09;是微软开发的一种用于分析服务的查询语言&#xff0c;主要用于处理多维数据集。MDX在商业智能和数据分析领域得到了广泛应用&#xff0c;尤其是在使用SQL Server Analysis Services&…

初学STM32 --- USMART

目录 USMART简介 USMART主要特点&#xff1a; USMART原理 USMART组成&#xff1a; USMART 的实现流程简单概括 USMART扫描函数&#xff1a; USMART系统命令 USMART移植 USMART简介 USMART是一个串口调试组件&#xff0c;可以大大提高代码调试效率&#xff01; USMART主…

SQL编程语言

第一章 1. 数据库是长期储存在计算机内&#xff0c;由专门的数据管理软件(数据库管理系统)&#xff0c;进行统一组织和管理控制的大量数据的集合。 2.数据库的基本特点不包括可以快速检索。 3. 数据管理技术的发展经历了&#xff1a;人工管理阶段、文件系统阶段、数据库系统阶…

LeetCode:165. 比较版本号(双指针 Java)

目录 165. 比较版本号 题目描述&#xff1a; 实现代码与解析&#xff1a; 双指针 原理思路&#xff1a; 165. 比较版本号 题目描述&#xff1a; 给你两个 版本号字符串 version1 和 version2 &#xff0c;请你比较它们。版本号由被点 . 分开的修订号组成。修订号的值 是它…

【Spring】Mybatis缓存+ehcache

文章目录 基础缓存基于Spring的Mybatis缓存ehcacheCacheableCachePutCacheEvictCaching 基础缓存 一级缓存 SqlSession 级别的缓存&#xff0c;它是默认开启的。每当执行一个查询操作时&#xff0c;MyBatis 会首先从一级缓存中查找结果&#xff0c;如果找到了相应的数据&…

【STM32+QT项目】基于STM32与QT的智慧粮仓环境监测与管理系统设计(完整工程资料源码)

视频演示: 基于STM32与QT的智慧粮仓环境监测与管理系统设计 目录: 目录 视频演示: 目录: 前言:

Backend - C# 操作数据库 DB(ADO.NET、LINQ to SQL、EF)

目录 一、ADO.NET&#xff08;传统&#xff09; 二、LINQ to SQL&#xff08;已过时&#xff09; 三、EF&#xff08;推荐&#xff09; 常见的操作数据库的方法&#xff1a;有三种&#xff0c;分别是 ADO.NET、LINQ to SQL、EF 一、ADO.NET&#xff08;传统&#xff09; ADO.NE…

机器学习周报-ModernTCN文献阅读

文章目录 摘要Abstract 0 提升有效感受野&#xff08;ERF&#xff09;1 相关知识1.1 标准卷积1.2 深度分离卷积&#xff08;Depthwise Convolution&#xff0c;DWConv&#xff09;1.3 逐点卷积&#xff08;Pointwise Convolution&#xff0c;PWConv&#xff09;1.4 组卷积(Grou…

《OpenCV计算机视觉实战项目》——银行卡号识别

文章目录 项目任务及要求项目实现思路项目实现及代码导入模块设置参数对模版图像中数字的定位处理银行卡的图像处理读取输入图像&#xff0c;预处理找到数字边框使用模版匹配&#xff0c;计算匹配得分 画出并打印结果 项目任务及要求 任务书&#xff1a; 要为某家银行设计一套…

Yolo11改进:注意力改进|Block改进|ESSAformer,用于高光谱图像超分辨率的高效Transformer|即插即用

摘要 一、论文介绍 高光谱图像超分辨率的重要性:高光谱成像技术通过密集采样光谱特征,为材料区分提供丰富的光谱和空间结构信息,广泛应用于各领域。高光谱图像超分辨率(HSI-SR)旨在从低分辨率HSI生成高分辨率HSI。传统方法的局限性:传统方法依赖手工制作的先验,如低秩近…

概要性了解Linux的总线设备驱动

引言 假如我们的板子上有很多LED&#xff0c;有时候需要操作这个LED&#xff0c;有时候需要操作另一个LED&#xff0c;我们希望代码可以清晰地组织在一起&#xff0c;方便扩展&#xff0c;同时自动为这些具体的设备生成对应的设备文件以供用户空间使用。 在Linux中&#xff0…