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

【C++】哈希表算法习题

在这里插入图片描述
🎆个人主页:夜晚中的人海

在这里插入图片描述

今日语录:只有经历地狱般的磨练,才能炼出创造天堂的力量。

文章目录

  • ⭐一、两数之和
  • 🎄二、判定是否为字符重排
  • 🏖️三、存在重复元素I
  • 🏠四、存在重复元素II
  • 🚀五、字母异位词分组

⭐一、两数之和

题目链接:两数之和

题目描述:

在这里插入图片描述

解题思路:
1.解法一:采用暴力解法,使用两层for循环遍历所有的数对,时间复杂度为O ( n² ),查找互补数时时间复杂度为O(n),整体时间复杂度高

2.解法二:使用哈希表,采用空间换时间的方法,存储已经遍历过的元素及其下标,将查找互补数的时间复杂度从O(n)降成O(1),整体时间复杂度变成O(n)

代码实现:

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {//存储元素的值和对应的下标unordered_map<int,int> hash;int n = nums.size();for(int i = 0;i < n;i++){int x = target - nums[i];if(hash.count(x))return {i,hash[x]};elsehash[nums[i]] = i;}return {-1,-1};}
};

🎄二、判定是否为字符重排

题目链接:判定是否为字符重排

题目描述:

在这里插入图片描述

解题思路:
1.先处理边界情况,如果两个字符串长度不相等,则说明这两个字符串肯定构不成重排,直接返回false即可

2.如果两个字符串能构成重排,说明两个字符串中出现的字符个数是相等的,因此问题就转化成看这两个字符串中出现的字符个数是否相等,我们就可以借助哈希表来统计字符出现的个数

代码实现:

class Solution {
public:bool CheckPermutation(string s1, string s2) {if(s1.size() != s2.size())return false;int hash[26] = {0};//遍历第一个字符串,并将其存进哈希表中for(auto ch : s1){hash[ch - 'a']++;}//遍历第二个字符串for(auto ch : s2){if(--hash[ch - 'a'] < 0)return false;}return true;}
};

🏖️三、存在重复元素I

题目链接:存在重复元素I

题目描述:

在这里插入图片描述

解题思路:
1.由于题目要求在数组中寻找至少出现两次的数字,因此我们只需检查当前数字是否已经出现过

2.借助哈希表这一容器,如果在遍历过程中该元素没出现过,则将它存进哈希表中,否则直接返回false即可

代码实现:

class Solution {
public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> hash;for(auto n : nums){if(hash.count(n)){return true;}hash.insert(n);}return false;}
};

🏠四、存在重复元素II

题目链接:存在重复元素II

题目描述:

在这里插入图片描述

解题思路:
1.我们可以使用哈希表,将数组元素和对应的下标绑定一块存入哈希表中,在哈希表中检查对是否出现过该元素

2.在遍历过程中如果哈希表中已经出现该元素,我们还需判断一下它们对应的下标差是否 <= K,如果是,则返回true,如果不是,我们可以大胆舍去前一个的下标,将其转换成新的下标(注:由于下标是不断变大的,如果前一个下标与当前遍历到的字符都不符合条件,那么它肯定与后面遍历到的字符也不符合条件)

代码实现:

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

🚀五、字母异位词分组

题目链接:字母异位词分组

题目描述:

在这里插入图片描述

解题思路:
1.当两个单词互为字母异位词时,当他们经过排序后,两个单词是完全相同的,因此根据这一特性,我们就可以将排序后的单词划分到同一组中,借助哈希表这一容器来实现这一功能

2.然后在从哈希表中提取我们所需要的结果即可

代码实现:

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string,vector<string>> hash;//将所有字母异位词进行分组for(auto s : strs){string tmp = s;sort(tmp.begin(),tmp.end());hash[tmp].push_back(s);}//将结果提取出来vector<vector<string>> ret;for(auto& [x,y] : hash){ret.push_back(y);}return ret;}
};

今天的分享就到这里啦,希望对您有所帮助!

http://www.dtcms.com/a/609865.html

相关文章:

  • 上传网站页面打不开怎么办莆田网站制作企业
  • Kotlin协程Flow流buffer缓冲批量任务或数据,条件筛选任务或数据
  • BuildingAI 控制台智能体菜单和页面功能PRD
  • 球机与云台摄像机的差异解析
  • Opencv(十二):图像矫正
  • Muon 优化器:通过正交化动量矩阵革命性地加速 AI 大模型训练
  • 11.14 脚本网页游戏 猜黑红
  • 网站引导页的作用网络营销msn是什么
  • 余姚网站开发wordpress头像同步
  • vxe-table 配置 ajax 加载列表数据,配置分页和查询搜索表单
  • worldpress 建站直播app定制开发
  • Java IDEA学习之路:第九周课程笔记归纳
  • Node.js 配置管理:生物启发式系统与跨维度架构
  • 《强量化 Transformers:开启计算机视觉新篇》
  • 免费做店招的网站国外用wordpress
  • 网站制作器手机版北京网页设计制作
  • 互联网服务的全链路架构流程解析
  • ARM与x86交叉编译实战排错指南
  • Agentic RL 如何让语⾔ 模型成为⾃主智能体
  • k8s之Headless浅谈
  • 安卓Telephony中的 phoneId、subId、simSlotIndex含义对比
  • dw做的网站怎么传到网络上去哪里有做ppt模板下载网站
  • 快速建站费用wordpress 注册简码
  • 从出厂到交付:能源设备运输如何实现全程风险可视化?
  • Kubernetes环境部署Redis集群
  • 公司门禁使用操作说明书
  • Wireshark网络数据包分析工具完整教程与实战案例
  • 以往届优秀展商为镜,探2026航空发动机与燃气轮机展——新奥能源
  • 先买空间再写网站广州番禺伤人案
  • 人工智能之数据分析 numpy:第二章 简介与安装