面试经典150题 -- 哈希表(总结)

总的链接

面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

383 . 赎金信

用哈希表模拟 ;

用两个长为26的整数数组模拟哈希表,分别统计r和m中的频次,如果在m中字符出现的都比r中的小,那么m一定能够由r构成,否则,返回false;

class Solution {
public:bool canConstruct(string r, string m) {int a[26] , b[26] ;for(int i=0;i<26;i++){a[i] = 0 ;b[i] = 0 ;}for(char c : r){a[(int)(c-'a')]++;}for(char c : m){b[(int)(c-'a')]++;}for(int i=0;i<26;i++){if(a[i] > b[i]) return false;}return true ;}
};

205 同构字符串

哈希表模拟,一遍遍历,如果发生与之前映射产生冲突,直接返回false;

class Solution {
public:bool isIsomorphic(string s, string t) {unordered_map<char,char> st;unordered_map<char,char> ts;int n = s.size();for(int i=0;i<n;i++){char a = s[i];char b = t[i];// 有冲突就直接返回false;if((st.count(a) && st[a] != b) || (ts.count(b) && ts[b] != a)) return false;st[a] = b;ts[b] = a;}return true;}
};

290 单词规律

与上题一样的思路 ;

class Solution {
public:bool wordPattern(string pattern, string s) {unordered_map<string,char> stc;unordered_map<char,string> cts;int m = s.size();int i = 0;for(auto ch : pattern){if(i>=m) return false;int j = i;while(j<m && s[j] != ' ') j++;const string &tmp = s.substr(i,j-i);if(stc.count(tmp) && stc[tmp] != ch) return false;if(cts.count(ch) && cts[ch] != tmp) return false;stc[tmp] = ch;cts[ch] = tmp;i = j + 1; }return i>=m;}
};

242 . 有效的字母异位词

用两个数组来分别统计s和t中每种字母的出现频次,最后遍历判断即可 ;

class Solution {
public:bool isAnagram(string s, string t) {int sn[26] = { 0 } ;int tn[26] = { 0 } ;for(char c : s) sn[c-'a']++;for(char c : t) tn[c-'a']++;for(int i=0;i<26;i++){if(sn[i]!=tn[i]) return false;}return true;}
};

49 . 字母异位词分组

用一个unordered_map<string,vector<string>> mp,key存排序后的字符串,value存原来的字符串,一遍遍历,将排序之后相同的字符串全部加入到map[s]中,然后用vector<vector<string>>来返回结果 ;

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> ans;unordered_map<string,vector<string>> smap;for(string s : strs){string tmp = s;sort(tmp.begin(),tmp.end());smap[tmp].emplace_back(s);}for(auto it = smap.begin();it!=smap.end();it++){ans.emplace_back(it->second);}return ans;}
};

1 . 两数之和

用一个哈希表(map)来存元素的值和对应的下标,题目要求nums[i]+nums[j]=target , 然后遍历的过程中对于nums[j],如果在之前的哈希表中能够找到target-nums[j],那么直接返回即可;

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int , int> mp ;int n = nums.size() ;for(int i = 0 ; i < n ; i ++){int x = target - nums[i] ;if(mp.find(x) != mp.end()){return {mp[x] , i};}mp[nums[i]] = i;}return {} ;}
};

202 . 快乐数

哈希表模拟,如果遇到之前已经遇到过的,那么就会死循环 ;

class Solution {
public:int getsum(int n){int sum = 0;while(n){sum += pow(n%10,2);n /= 10;}return sum;}bool isHappy(int n) {unordered_set<int> s;while(1){int sum = getsum(n);if(sum==1) return true;if(s.find(sum)!=s.end()) return false;else s.insert(sum);n = sum;}}
};

219 . 存在重复元素

哈希表加滑动窗口

class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {int n = nums.size();unordered_set<int> s;for(int i=0;i<n;i++){if(i>k) s.erase(nums[i-k-1]);if(s.count(nums[i])) return true;s.emplace(nums[i]);}return false;}
};

128 . 最长连续序列

法一(双指针)

先排序 + 去重,然后用双指针模拟

class Solution {
public:int longestConsecutive(vector<int>& nums) {if(nums.size()==0) return 0 ;sort(nums.begin(),nums.end()) ;nums.erase(unique(nums.begin(),nums.end()),nums.end()) ;int ans = 1  , n = nums.size();for(int i=0;i<n;i++){int j = i + 1;while(j<n && nums[j]-nums[j-1]==1){j++;}ans = max(ans , j-i);i = j - 1 ;}return ans ;}
};

 法二(哈希表):

O(n),先用哈希表将所有元素存下来,然后一遍遍历,在遍历的过程中,对每个序列开头,进行判断;

详细实现请看代码 : 

class Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_set<int> num_set;for (const int& num : nums) {num_set.insert(num);}int longestStreak = 0;for (const int& num : num_set) {if (!num_set.count(num - 1)) {int currentNum = num;int currentStreak = 1;while (num_set.count(currentNum + 1)) {currentNum += 1;currentStreak += 1;}longestStreak = max(longestStreak, currentStreak);}}return longestStreak;           }
};

法三(dp)

先排序+去重 ;

然后dp找最大长度 ;

class Solution {
public:int longestConsecutive(vector<int>& nums) {int n = nums.size();if(n==0) return 0;sort(nums.begin(),nums.end());// 使用 std::unique 函数移除重复元素,并返回指向新的逻辑结尾的迭代器auto it = std::unique(nums.begin(), nums.end());// 使用容器的 erase 函数擦除重复元素之后的部分nums.erase(it, nums.end());vector<int> dp(n,1);int ans = 0;for(int i=1;i<n;i++){if(nums[i]-nums[i-1] == 1) dp[i]=dp[i-1]+1;}for(int i=0;i<n;i++) ans = max(ans,dp[i]);return ans;}
};
// -1 -1 0 1 3 4 5 6 7 8 9

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

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

相关文章

FUXA远程命令执行漏洞(CVE-2023-33831)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义

链表 空链表&#xff1a; 注意&#xff1a;函数不能返回局部变量的地址 操作&#xff1a; 1.创建空链表 2.头插 3.尾插 4.链表遍历 5.链表的长度 free&#xff1a;释放 删除&#xff1a; 头删 void popFront(struct Node *head) { //1.p指针变量指向首节点 //2.断…

BeanDefinitionReader学习

Spring版本5.1.0 Spring中的BeanDefinitionReader是一个接口&#xff0c;用于读取BeanDefinition并将其注册到Spring容器中。BeanDefinitionReader的主要作用是从资源文件中读取配置信息&#xff0c;并将其转换为BeanDefinition对象&#xff0c;然后将其注册到Spring容器中。B…

springboot完成一个线上图片存放地址+实现前后端上传图片+回显

1.路径 注意路径 2.代码&#xff1a;&#xff08;那个imagePath没什么用&#xff0c;懒的删了&#xff09;&#xff0c;注意你的本地文件夹要有图片&#xff0c;才可以在线上地址中打开查看 package com.xxx.common.config;import org.springframework.beans.factory.annotat…

【云手机】快速获取一台属于你的云手机,在云上调试你的应用!

0x00 前言 随着科技的飞速发展&#xff0c;云手机已然成为一种云端虚拟商品&#xff0c;它打破地域限制&#xff0c;让你随时随地畅享移动体验。红手指、小鱼云手机等平台虽便捷易用&#xff0c;却在可扩展性和隐私性方面有所欠缺。冗长的《隐私政策》是否让你望而却步&#x…

LabVIEW潜油电泵数据采集系统

LabVIEW潜油电泵数据采集系统 介绍一个基于LabVIEW的潜油电泵数据采集系统。该系统目的是通过高效的数据采集和处理&#xff0c;提高潜油电泵的性能监控和故障诊断能力。 系统由硬件和软件两部分组成。硬件部分主要包括数据采集卡、传感器和电泵等&#xff0c;而软件部分则是…

网络开启代理之后git还是连接超时

网络开启代理之后git还是连接超时 当电脑开启网络代理之后&#xff0c;浏览器能够正常访问GitHub&#xff0c;可是使用git拉取仓库时还是超时。 问题 $ git clone https://github.com/xxx/notes.git Cloning into notes... fatal: unable to access https://github.com/xxx/…

ARM架构可视化ROS消息方案部署

ARM架构可视化ROS消息方案部署 三种方案, 1. webviz 2. foxglove 3. rosviz 注: web要用firefox, chromimum用不了, 可能是因为取消了时间同步机制的原因 先说三种方案的优劣, webviz 延迟比较高, 但是部署相对简单, foxglove 部署比较费劲, 但是效果不错, 延迟低, 本文会尽…

KMP算法解决——找出字符串中第一个匹配项的下标(深入图解KMP算法)

"The only way to do great work is to love what you do." ​- Steve Jobs 首先我们先来回顾一下题目&#xff1a; 1. 先正儿八经的拿比较官方的说法来解释一下KMP算法 KMP&#xff08;Knuth-Morris-Pratt&#xff09;算法是一种用于在一个文本串中查找一个模式串…

睿尔曼超轻量仿人机械臂—外置按钮盒使用说明

睿尔曼RM系列机械臂的控制方式有很多种&#xff0c;包括&#xff1a;示教器、JSON、API等。在此为大家介绍外置按钮盒的使用方法。 按钮盒接线安装 按钮盒外观如下图所示&#xff0c;有&#xff1a;急停、暂停、开始、继续。四个功能按钮。用户可通过这四个按钮来实现对机械臂运…

OpenCV 14 - 自定义线性滤波

1 卷积 1-1概念 卷积是图像处理中一个操作,kernel在图像的每个像素上的操作。 Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点 1-2 卷积如何工作 把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点覆盖下像素点值称为卷积处理。 …

2024年美赛E题:财产保险的可持续性 Sustainability of Property Insurance 思路模型代码解析

2024年美赛E题&#xff1a;财产保险的可持续性 Sustainability of Property Insurance 思路模型代码解析 【点击最下方群名片&#xff0c;加入群聊&#xff0c;获取更多思路与代码哦~】 问题翻译 极端天气事件对房产所有者和保险公司已经成为一场危机。近年来&#xff0c;世界…