【面试HOT100】哈希双指针滑动窗口
系列综述:
💞目的:本系列是个人整理为了秋招面试
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
🥰来源:材料主要源于LeetCodeHot100进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
🤭结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢🎈🎄🌷!!!
🌈【C++】秋招&实习面经汇总篇
文章目录
- 基本算法
- 哈希篇
- 1. 两数之和
- 49. 字母异位词分组
- 128. 最长连续序列
- 双指针篇
- 283. 移动零
- 11. 盛最多水的容器
- 15. 三数之和
- 42. 接雨水
- 滑动窗口篇
- 3. 无重复字符的最长子串
- 438. 找到字符串中所有字母异位词
😊点此到文末惊喜↩︎
基本算法
- 排序
- set去重
- 哈希:数组全部扔入
unordered_map
可通过O(1)
时间进行查找
哈希篇
1. 两数之和
- 问题
- 给定一个整数数组 nums 和一个整数目标值 target
- 在该数组中找出和为目标值 target 的那 两个 整数,并返回它们的数组下标。
- 思路
- 暴力方法
- 两次遍历
- 第一次利用数组初始化哈希表
- 第二次寻找非自身节点的目标结点
- 单次遍历
- 拿起一个看看和口袋中是否有一样的,没有则放入口袋
vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> umap; // 哈希表:存放数组中元素的位置和下标vector<int> res(2,-1); for (int i = 0; i < nums.size(); i++) {// 若含有目标元素,则赋值并结束循环if (umap.count(target-nums[i]) > 0) { // *判断是否含有元素res[0]=a[target-nums[i]];res[1]=i;break;}// 没有则记录umap[nums[i]]=i; // *map的插入:key为数组元素,value为数组下标}return res;
};
- 总结
- unordered_map比map更加节省空间
- 使用
if (umap.count(target_key) > 0)
,判断目标元素是否存在
49. 字母异位词分组
- 问题
- 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
- 给你一个字符串数组,请你将 字母异位词 组合在一起
- 思路
- 简化:key是
唯一
性标识,value是任意类型的目标
- 简化:key是
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> res;unordered_map <string,vector<string> > m;for(const string& s : strs) {string t = s; // 利用字符串进行比较sort(t.begin(),t.end());m[t].push_back(s); }for(auto& n : m) res.push_back(n.second);return res;}
};
128. 最长连续序列
- 问题
- 给定一个未排序的整数数组 nums
- 找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
- 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
- 思路
- 通过数组初始化
unordered_set
,方便O(1)时间的查找 - 去重优化:最长子序列一定是从最小的开始的,所有若n-1存在则直接跳过
- 通过数组初始化
class Solution {
public:int longestConsecutive(vector<int>& nums) {int res = 0;unordered_set<int> s(nums.begin(), nums.end());for(auto &n : s) {// 健壮性检查:去重if(s.count(n-1)) continue; // 初始化、算法、收尾int cnt = 0;while(s.count(n++)) ++cnt;res = max(res, cnt);}return res;}
};
双指针篇
283. 移动零
- 问题
- 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾
- 同时保持非零元素的相对顺序。
- 思路
- 快慢指针 + 交换
void moveZeroes(vector<int>& nums) {int slow = 0, fast = 0;while (fast < nums.size()) {if (nums[fast] != 0) {swap(nums[slow], nums[fast]);slow++;}++fast;}
}
11. 盛最多水的容器
- 问题
- 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])
- 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水,返回容器可以储存的最大水量。
- 思路
- 边界双指针:左右边界向中间慢慢收缩
int maxArea(vector<int>& height) {int left = 0, right = height.size() - 1int res = 0;while(left < right) {res = height[left] < height[right] ? max(res, (right - left) * height[right++]): max(res, (right - left) * height[right--]); }return res;}
- 待定思路
- 左边向中间找更高,记录最值,右边向中间找更高,记录最值。
15. 三数之和
- 问题
- 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。
- 返回所有和为 0 且不重复的三元组。
- 答案中不可以包含重复的三元组。
- 思路
- 排序 + 分类讨论 + 去重
- 排序 + 分类讨论 + 去重
vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(), nums.end()); // 排序:从小到大// 找出a + b + c = 0// a = nums[i], b = nums[left], c = nums[right]for (int i = 0; i < nums.size(); i++) {// 健壮性检查if (nums[i] > 0) return result; // 排序若首元素已大于零,则不可能凑出结果if (i > 0 && nums[i] == nums[i - 1])// i的去重:i和已使用过的i-1比较,才是三元组间的去重continue;// 初始化int left = i + 1;int right = nums.size() - 1;// 算法部分while (left < right) {// 情况分类讨论if (nums[i] + nums[left] + nums[right] > 0) right--;else if (nums[i] + nums[left] + nums[right] < 0) left++;else {// key:注意如何进行vector的直接构造压入result.push_back(vector<int>{nums[i], nums[left], nums[right]});// 对left和right的去重while (left < right && nums[right] == nums[right - 1]) right--;while (left < right && nums[left] == nums[left + 1]) left++;// 找到答案时,双指针同时收缩right--;left++; }}}return result;
}
42. 接雨水
- 问题
- 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图
- 计算按此排列的柱子,下雨之后能接多少雨水。
- 思路
- 分类讨论:更大、更小、相等
- 分类讨论:更大、更小、相等
// 接雨水
int trap(vector<int>& height) {if (height.size() <= 2) return 0; // 可以不加stack<int> st; // 存着下标,计算的时候用下标对应的柱子高度st.push(0);int sum = 0;for (int i = 1; i < height.size(); i++) {if (height[i] < height[st.top()]) { // 情况一st.push(i);} if (height[i] == height[st.top()]) { // 情况二st.pop(); // 其实这一句可以不加,效果是一样的,但处理相同的情况的思路却变了。st.push(i);} else { // 将i之前的比i小的全部凹槽计算水量while (!st.empty() && height[i] > height[st.top()]) { // 注意这里是whileint mid = st.top();st.pop();if (!st.empty()) { int h = min(height[st.top()], height[i]) - height[mid];int width = i - st.top() - 1; sum += h * w;}}st.push(i);}}return sum;
}
// 优化
// 接雨水
int trap(vector<int>& height) {if (height.size() <= 2) return 0; // 可以不加stack<int> st; // 存着下标,计算的时候用下标对应的柱子高度st.push(0);int sum = 0;for (int right = 1; right < height.size(); right++) {// 将前面小的全部出栈:计算right前的比height[right]的全部凹槽计算水量while (!st.empty() && height[right] > height[st.top()]) { int mid = st.top();st.pop();if (!st.empty()) { // st.top()为left的下标,即左右两柱-底部高度为水槽高度int left = st.top();int depth = min(height[left], height[right]) - height[mid];int width = right - left - 1; sum += depth * width;}}st.push(right);}return sum;
}
滑动窗口篇
解决的问题:
给定一个线性表(字符串、数组等),一次遍历求满足指定条件的连续子部分
3. 无重复字符的最长子串
- 问题
- 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
- 思路
- 滑动窗口
int lengthOfLongestSubstring(string s) {const int N = s.size();if (N < 2) return N;int res = 0;unordered_map<char, int> umap;umap[s[0]] = 0;int slow = 0, fast = 1;while (fast < N) {// 缩小窗口:必须保证重复字符在滑动窗口内,因为过去的字符仍然在窗口内if (umap.count(s[fast]) > 0 && slow <= umap[s[fast]]) // 后半段判断的含义?slow = umap[s[fast]] + 1;// 扩大窗口umap[s[fast]] = fast;++fast;res = max(fast-slow, res);}return res;}
438. 找到字符串中所有字母异位词
- 问题
- 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。
- 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
- 思路
- 快慢指针 + 交换
// 返回字符串 s 中包含字符串 t 的全部字符的最小窗口
string SlideWindow(string s, string t) {// need记录子串情况,window记录合适窗口unordered_map<char, int> need, window;for (char c : t) need[c]++;int left = 0, right = 0;// 记录最小覆盖子串的起始索引及长度int start = 0, len = INT_MAX;int valid = 0;while (right < s.size()) {char c = s[right]; // c 是将移入窗口的字符right++; // 右移窗口// 进行窗口内数据的一系列更新if (need.count(c)) {window[c]++;if (window[c] == need[c])valid++;}while (valid == need.size()) { // TODO:收缩条件// TODO:更新结果记录if (right - left < len) { start = left;// 更新起始值len = right - left;// 最小长度}// 收缩窗口char d = s[left];left++;// TODO:收缩处理if (need.count(d)) {if (window[d] == need[d])valid--;window[d]--;} }}// 返回最小覆盖子串return len == INT_MAX ?"" : s.substr(start, len);
}
相关文章:

【面试HOT100】哈希双指针滑动窗口
系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于LeetCodeHot100进行的,每个知识点的修正和深入主要参考…...

Ubuntu20.04 配置 yolov5_ros 功能包记录
文章目录 本文参考自博主源801,结合自己踩坑后修改 项目地址:https://github.com/mats-robotics/yolov5_ros 1.新建工作空间 新建一个工作空间 yolo_ros(名字可自定义),在 yolo_ros 下新建文件夹 src 并catkin_make进行编译 2. 安装相机驱动,可以选用较为主流的 usb_cam 或…...

Flink的处理函数——processFunction
目录 一、处理函数概述 二、Process函数分类——8个 (1)ProcessFunction (2)KeyedProcessFunction (3)ProcessWindowFunction (4)ProcessAllWindowFunction ÿ…...
Linux系统中的ps命令详解及用法介绍
文章目录 一、介绍ps命令A. ps命令的作用B. ps命令的参数 二、常见的ps命令用法A. 显示所有进程信息B. 显示指定进程信息C. 显示指定用户的进程信息D. 按CPU使用率排序显示进程信息E. 按内存使用率排序显示进程信息 三、进一步了解ps命令A. 显示进程树信息B. 显示线程和进程关系…...

机器学习笔记 - 基于pytorch、grad-cam的计算机视觉的高级可解释人工智能
一、pytorch-gradcam简介 Grad-CAM是常见的神经网络可视化的工具,用于探索模型的可解释性,广泛出现在各大顶会论文中,以详细具体地描述模型的效果。Grad-CAM的好处是,可以在不额外训练的情况下,只使用训练好的权重即可获得热力图。 1、CAM是什么? CAM全称Class Activa…...
Python 编程基础 | 第五章-类与对象 | 5.1、定义类
一、类 1、定义类 Python中使用class关键字定义类,class之后为类的名称并以:结尾,类的结构如下: class 类名:多个(≥0)类属性...多个(≥0)类方法...下面定义一个Dog类,如…...

合宙Air780e+luatos+腾讯云物联网平台完成设备通信与控制(属性上报+4G远程点灯)
1.腾讯云物联网平台 首先需要在腾讯云物联网平台创建产品、创建设备、定义设备属性和行为,例如: (1)创建产品 (2)定义设备属性和行为 (3)创建设备 (4)准备参…...

c++系列之string的模拟实现
💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 string() //注意事项: 1.初始化列表随声明的顺序进行初始化 2.cons…...

Spring的beanName生成器AnnotationBeanNameGenerator
博主介绍:✌全网粉丝4W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
FFmpeg 命令:从入门到精通 | ffmpeg 命令直播
FFmpeg 命令:从入门到精通 | ffmpeg 命令直播 FFmpeg 命令:从入门到精通 | ffmpeg 命令直播直播拉流直播推流 FFmpeg 命令:从入门到精通 | ffmpeg 命令直播 本节主要介绍了ffmpeg 命令进行直播拉流、推流的方法,并列举了一些例子…...

A (1087) : DS单链表--类实现
Description 用C语言和类实现单链表,含头结点 属性包括:data数据域、next指针域 操作包括:插入、删除、查找 注意:单链表不是数组,所以位置从1开始对应首结点,头结点不放数据 类定义参考 #include<…...

异常:找不到匹配的key exchange算法
目录 问题描述原因分析解决方案 问题描述 PC 操作系统:Windows 10 企业版 LTSC PC 异常软件:XshellPortable 4(Build 0127) PC 正常软件:PuTTY Release 0.74、MobaXterm_Personal_23.1 服务器操作系统:OpenEuler 22.03 (LTS-SP2)…...

Arcgis打开影像分析窗口没反应
Arcgis打开影像分析窗口没反应 问题描述 做NDVI计算的时候,一直点击窗口-影像分析,发现影像分析的小界面一直不跳出来。 原因 后来发现是被内容列表给遮住了,其实是已经出来了的。。 拖动内容列表就能找到。 解决方案 内容列表和影像分…...

Spring(JavaEE进阶系列1)
目录 前言: 1.Servlet与Spring对比 2.什么是Spring 2.1什么是容器 2.2什么是IoC 2.3SpringIoC容器的理解 2.4DI依赖注入 2.5IoC与DI的区别 3.Spring项目的创建和使用 3.1正确配置Maven国内源 3.2Spring的项目创建 3.3将Bean对象存储到Spring(…...

Flink状态管理与检查点机制
1.状态分类 相对于其他流计算框架,Flink 一个比较重要的特性就是其支持有状态计算。即你可以将中间的计算结果进行保存,并提供给后续的计算使用: 具体而言,Flink 又将状态 (State) 分为 Keyed State 与 Operator State: 1.1 算子状态 算子状态 (Operator State):顾名思义…...

【threejs】基本编程概念及海岛模型展示逻辑
采用three封装模式完成的海岛动画(点击这里查看) 直接上代码吧 <template><div class"scene"><video id"videoContainer" style"position:absolute;top:0px;left:0px;z-index:100;visibility: hidden"&g…...
python小技巧:创建单链表及删除元素
目前只有单链表(无法查找上一个元素),后面再更新循环链表和双链表。 class SingleLinkedList:def createList(self, raw_list):if len(raw_list) 0:head ListNode()else:head ListNode(raw_list[0])cur headfor i in range(1, len(raw_l…...

ADuM1250 ADuM1251 模块 I2C IIC总线2500V电磁隔离 接口保护
功能说明: 1,2500V电磁隔离,2通道双向I2C; 2,支持电压在3到5.5V,最大时钟频率可达1000KHz; 3,将该隔离模块接入总线,可以保护主MCU引脚,降低I2C总线上的干…...

C# 把多个dll合成一个dll
Nuget 下载ILMerge两个工程 dog为测试工程 TestIlmerge为准备合并的类库 如下图所示, 由于我们引用下面4个库 正常生成后,会有TestIlmerge.dll和下面的这4个dll 只生成TestIlmerge.dll 打开工程文件 在最下方加入以下两段 <Target Name"ILMerge…...
scipy.sparse.coo_matrix.sum()关于axis的用法
以下面的矩阵为例 [1,2,0] [0,3,0] [0,0,0]示例代码 from scipy.sparse import coo_matrix# 创建一个稀疏矩阵 data [1, 2, 3] row [0, 0, 1] col [0, 1, 1] sparse_matrix coo_matrix((data, (row, col)), shape(3,3))# 计算稀疏矩阵中每行非零元素的总和 sum_of_column…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...

Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...

C++11 constexpr和字面类型:从入门到精通
文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...

【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器
从本章节开始,进入到函数有多个参数的情况,前面几个章节中介绍了整型和浮点型使用了不同的寄存器在进行函数传参,ECX是整型的第一个参数的寄存器,那么多个参数的情况下函数如何传参,下面展开介绍参数为整型时候的几种情…...
更新 Docker 容器中的某一个文件
🔄 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法,适用于不同场景。 ✅ 方法一:使用 docker cp 拷贝文件到容器中(最简单) 🧰 命令格式: docker cp <…...

在MobaXterm 打开图形工具firefox
目录 1.安装 X 服务器软件 2.服务器端配置 3.客户端配置 4.安装并打开 Firefox 1.安装 X 服务器软件 Centos系统 # CentOS/RHEL 7 及之前(YUM) sudo yum install xorg-x11-server-Xorg xorg-x11-xinit xorg-x11-utils mesa-libEGL mesa-libGL mesa-…...