当前位置: 首页 > news >正文

【面试HOT100】哈希双指针滑动窗口

系列综述:
💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
🥰来源:材料主要源于LeetCodeHot100进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
🤭结语:如果有帮到你的地方,就点个赞关注一下呗,谢谢🎈🎄🌷!!!
🌈【C++】秋招&实习面经汇总篇


文章目录

      • 基本算法
      • 哈希篇
        • 1. 两数之和
        • 49. 字母异位词分组
        • 128. 最长连续序列
      • 双指针篇
        • 283. 移动零
        • 11. 盛最多水的容器
        • 15. 三数之和
        • 42. 接雨水
      • 滑动窗口篇
        • 3. 无重复字符的最长子串
        • 438. 找到字符串中所有字母异位词


😊点此到文末惊喜↩︎

基本算法

  1. 排序
  2. set去重
  3. 哈希:数组全部扔入unordered_map可通过O(1)时间进行查找

哈希篇

1. 两数之和
  1. 问题
    • 给定一个整数数组 nums 和一个整数目标值 target
    • 在该数组中找出和为目标值 target 的那 两个 整数,并返回它们的数组下标。
  2. 思路
    • 暴力方法
    • 两次遍历
      • 第一次利用数组初始化哈希表
      • 第二次寻找非自身节点的目标结点
    • 单次遍历
      • 拿起一个看看和口袋中是否有一样的,没有则放入口袋
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;
};
  1. 总结
    • unordered_map比map更加节省空间
    • 使用if (umap.count(target_key) > 0),判断目标元素是否存在
49. 字母异位词分组
  1. 问题
    • 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
    • 给你一个字符串数组,请你将 字母异位词 组合在一起
  2. 思路
    • 简化:key是唯一性标识,value是任意类型的目标
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. 最长连续序列
  1. 问题
    • 给定一个未排序的整数数组 nums
    • 找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
    • 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
  2. 思路
    • 通过数组初始化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. 移动零
  1. 问题
    • 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾
    • 同时保持非零元素的相对顺序。
  2. 思路
    • 快慢指针 + 交换
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. 盛最多水的容器
  1. 问题
    • 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])
    • 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水,返回容器可以储存的最大水量。
  2. 思路
    • 边界双指针:左右边界向中间慢慢收缩
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;}
  1. 待定思路
    • 左边向中间找更高,记录最值,右边向中间找更高,记录最值。
15. 三数之和
  1. 问题
    • 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。
    • 返回所有和为 0 且不重复的三元组。
    • 答案中不可以包含重复的三元组。
  2. 思路
    • 排序 + 分类讨论 + 去重在这里插入图片描述
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. 接雨水
  1. 问题
    • 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图
    • 计算按此排列的柱子,下雨之后能接多少雨水。
  2. 思路
    • 分类讨论:更大、更小、相等
      在这里插入图片描述
// 接雨水
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. 无重复字符的最长子串
  1. 问题
    • 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
  2. 思路
    • 滑动窗口
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. 找到字符串中所有字母异位词
  1. 问题
    • 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。
    • 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
  2. 思路
    • 快慢指针 + 交换
// 返回字符串 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】哈希双指针滑动窗口

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于LeetCodeHot100进行的&#xff0c;每个知识点的修正和深入主要参考…...

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个 &#xff08;1&#xff09;ProcessFunction &#xff08;2&#xff09;KeyedProcessFunction &#xff08;3&#xff09;ProcessWindowFunction &#xff08;4&#xff09;ProcessAllWindowFunction &#xff…...

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关键字定义类&#xff0c;class之后为类的名称并以:结尾&#xff0c;类的结构如下&#xff1a; class 类名&#xff1a;多个&#xff08;≥0&#xff09;类属性...多个&#xff08;≥0&#xff09;类方法...下面定义一个Dog类&#xff0c;如…...

合宙Air780e+luatos+腾讯云物联网平台完成设备通信与控制(属性上报+4G远程点灯)

1.腾讯云物联网平台 首先需要在腾讯云物联网平台创建产品、创建设备、定义设备属性和行为&#xff0c;例如&#xff1a; &#xff08;1&#xff09;创建产品 &#xff08;2&#xff09;定义设备属性和行为 &#xff08;3&#xff09;创建设备 &#xff08;4&#xff09;准备参…...

c++系列之string的模拟实现

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; string() //注意事项&#xff1a; 1.初始化列表随声明的顺序进行初始化 2.cons…...

Spring的beanName生成器AnnotationBeanNameGenerator

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…...

FFmpeg 命令:从入门到精通 | ffmpeg 命令直播

FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令直播 FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令直播直播拉流直播推流 FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令直播 本节主要介绍了ffmpeg 命令进行直播拉流、推流的方法&#xff0c;并列举了一些例子…...

A (1087) : DS单链表--类实现

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

异常:找不到匹配的key exchange算法

目录 问题描述原因分析解决方案 问题描述 PC 操作系统&#xff1a;Windows 10 企业版 LTSC PC 异常软件&#xff1a;XshellPortable 4(Build 0127) PC 正常软件&#xff1a;PuTTY Release 0.74、MobaXterm_Personal_23.1 服务器操作系统&#xff1a;OpenEuler 22.03 (LTS-SP2)…...

Arcgis打开影像分析窗口没反应

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

Spring(JavaEE进阶系列1)

目录 前言&#xff1a; 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&#xff08…...

Flink状态管理与检查点机制

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

【threejs】基本编程概念及海岛模型展示逻辑

采用three封装模式完成的海岛动画&#xff08;点击这里查看&#xff09; 直接上代码吧 <template><div class"scene"><video id"videoContainer" style"position:absolute;top:0px;left:0px;z-index:100;visibility: hidden"&g…...

python小技巧:创建单链表及删除元素

目前只有单链表&#xff08;无法查找上一个元素&#xff09;&#xff0c;后面再更新循环链表和双链表。 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电磁隔离 接口保护

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

C# 把多个dll合成一个dll

Nuget 下载ILMerge两个工程 dog为测试工程 TestIlmerge为准备合并的类库 如下图所示&#xff0c; 由于我们引用下面4个库 正常生成后&#xff0c;会有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…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...

简单介绍C++中 string与wstring

在C中&#xff0c;string和wstring是两种用于处理不同字符编码的字符串类型&#xff0c;分别基于char和wchar_t字符类型。以下是它们的详细说明和对比&#xff1a; 1. 基础定义 string 类型&#xff1a;std::string 字符类型&#xff1a;char&#xff08;通常为8位&#xff09…...