【面试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);
}

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

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

相关文章

【数据结构与算法】树、二叉树的概念及结构(详解)

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--树以及二叉树的概念与结构 目录 一.树概念及结构 1.树的概念 1.1树与非树 树的特点&#xff1…

XXL-JOB源码梳理——一文理清XXL-JOB实现方案

分布式定时任务调度系统 流程分析 一个分布式定时任务&#xff0c;需要具备有以下几点功能&#xff1a; 核心功能&#xff1a;定时调度、任务管理、可观测日志高可用&#xff1a;集群、分片、失败处理高性能&#xff1a;分布式锁扩展功能&#xff1a;可视化运维、多语言、任…

【计算机网络笔记八】应用层(五)HTTPS

什么是 HTTPS HTTPS 解决了 HTTP 不安全的问题 HTTP 整个传输过程数据都是明文的&#xff0c;任何人都能够在链路中截获、修改或者伪造请求&#xff0f;响应报文&#xff0c;数据不具有可信性。 ① HTTPS 使用加密算法对报文进行加密&#xff0c;黑客截获了也看不懂 ② HTTP…

Play Beyond:Sui让优秀的游戏变得更好

自问世以来&#xff0c;视频游戏就紧随着文化产业发展。从Pong和Space Invaders的时代到Animal Crossing和Among Us&#xff0c;伟大的游戏总有能力吸引玩家&#xff0c;并推动娱乐产业发展。根据Grand View Research的数据&#xff0c;全球视频游戏市场在2022年估计为2170.6亿…

CUDA C编程权威指南:1.1-CUDA基础知识点梳理

主要整理了N多年前&#xff08;2013年&#xff09;学习CUDA的时候开始总结的知识点&#xff0c;好长时间不写CUDA代码了&#xff0c;现在LLM推理需要重新学习CUDA编程&#xff0c;看来出来混迟早要还的。 1.CUDA 解析&#xff1a;2007年&#xff0c;NVIDIA推出CUDA&#xff08…

Docker 日志管理 - ELK

Author&#xff1a;rab 目录 前言一、Docker 日志驱动二、ELK 套件部署三、Docker 容器日志采集3.1 部署 Filebeat3.2 配置 Filebeat3.3 验证采集数据3.4 Kibana 数据展示3.4.1 创建索引模式3.4.2 Kibana 查看日志 总结 前言 如何查看/管理 Docker 运行容器的日志&#xff1f;…

图像拼接后丢失数据,转tiff报错rasterfile failed: an unknown

图像拼接后丢失数据 不仅是数据丢失了&#xff0c;还有个未知原因报错 部分数据存在值不存在的情况 原因 处理遥感数据很容易&#xff0c;磁盘爆满了 解决方案 清理一些无用数据&#xff0c;准备买个2T的外接硬盘用着了。 然后重新做处理

redis高可用(主从复制,哨兵,集群)

目录 一、主从复制&#xff1a; 1.主从复制介绍&#xff1a; 2.主从复制的作用&#xff1a; 3.主从复制流程&#xff1a; 4.搭建Redis 主从复制&#xff1a; 4.1 环境准备&#xff1a; 4.2 安装redis&#xff1a; 4.3 master节点修改 Redis 配置文件&#xff1a; 4.4 slave节点…

Linux学习之悟空派上实现OLED的无线网IP及CPU温度显示【守护进程】

起因 最近各种网购平台似乎都在推送99元的悟空派全志H3的开发板&#xff0c;出于好奇就买了一块来试试水&#xff0c;由于这块板子基本上和orangepi-Zero的硬件结构一模一样&#xff0c;所以设备树、boot这些就用orangepi现成的部件了。 因为本人比较喜欢使用SSH操作&#xff…

C++——list(2)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年9月28日 内容&#xff1a;C——list内容讲解 目录 前言&#xff1a; list的const迭代器&#xff1a; const的iterator&#xff1a; const迭代器&#xff1a; operator->: 拷贝构造&#xff1a; 迭代器接口补充&…

【LittleXi】【MIT6.S081-2020Fall】Lab: locks

【MIT6.S081-2020Fall】Lab: locks 【MIT6.S081-2020Fall】Lab: locks内存分配实验内存分配实验准备实验目的1. 举一个例子说明修改前的**kernel/kalloc.c**中如果没有锁会导致哪些进程间竞争(races)问题2. 说明修改前的kernel/kalloc.c中锁竞争contention问题及其后果3. 解释a…

Elasticsearch安装访问

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎&#xff0c;设计用于云计算环境中&#xff0c;能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性&#xff0c;可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

【云笔记篇】Microsoft OneNote笔记插件推荐OneMore

【云笔记篇】Microsoft OneNote笔记插件推荐OneMore OneMore插件是一款非常强大&#xff0c;多达一百多个扩展功能的OneNote笔记插件&#xff0c;而且免费开源&#xff0c;不断更新的优秀插件—【蘇小沐】 1、实验 【OneMore官网&#xff1a;OneMore - a OneNote add-in (on…

C++——类和对象

文章目录 1.面向过程和面向对象的区别2.类的定义3.类的特点3.1封装性3.2继承性3.3多态性 4.类的访问限定符及封装4.1访问限定符4.2封装 5.类的作用域6.类的实例化7.计算类对象大小8.this指针8.1this指针的引出8.2this指针的特性 9.类的6个默认成员函数9.1默认构造函数9.1.1概念…

Elastic SQL 输入:数据库指标可观测性的通用解决方案

作者&#xff1a;Lalit Satapathy, Ishleen Kaur, Muthukumar Paramasivam Elastic SQL 输入&#xff08;metricbeat 模块和输入包&#xff09;允许用户以灵活的方式对许多支持的数据库执行 SQL 查询&#xff0c;并将结果指标提取到 Elasticsearch。 本博客深入探讨了通用 SQL …

单调队列---数据结构与算法

简介 队列也是一种受限制的线性表和栈相类似&#xff0c;栈是先进后出&#xff0c;而队列是先进先出&#xff0c;就好像一没有底的桶&#xff0c;往里面放东西&#xff0c;如图 在这里也是用数组来实现队列&#xff0c;用数组实现的叫做顺序队列 队列的数组模拟 const int N…

学习笔记|ADC反推电源电压|扫描按键(长按循环触发)|课设级实战练习|STC32G单片机视频开发教程(冲哥)|第十八集:ADC实战

文章目录 1.ADC反推电源电压测出Vref引脚电压的意义?手册示例代码分析复写手册代码Tips&#xff1a;乘除法与移位关系为什么4096后面还有L 2.ADC扫描按键(长按循环触发)长按触发的实现 3.实战小练1.初始状态显示 00 - 00 - 00&#xff0c;分别作为时&#xff0c;分&#xff0c…

buuctf-[GXYCTF2019]禁止套娃 git泄露,无参数rce

用dirsearch扫一下&#xff0c;看到flag.php 访问一下没啥东西&#xff0c;使用githack python2 GitHack.py http://8996e81f-a75c-4180-b0ad-226d97ba61b2.node4.buuoj.cn/.git/查看index.php <?php include "flag.php"; echo "flag在哪里呢&#xff1f;…