算法练习——哈希表

embedded/2025/2/14 4:51:02/

一:两数之和

题目要求:

解题思路:

常规思路(暴力方法):定义两个指针遍历,满足条件时,返回下标。

优化版本:如下图

实现代码:

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> ret;unordered_map<int,int> hash;for(int i = 0; i < nums.size();  i++) {int tmp = target - nums[i];if(hash.count(tmp)) {return {hash[tmp],i};}hash[nums[i]] = i;}return {-1,-1};}
};

二:判定是否互为字符重排

题目要求:

解题思路:

思路:因为字符串中只包含小写字母,因此定义一个数组来模拟哈希表。分别遍历字符串s2和s1,前者在哈希表中做加法运算,后者做减法运算,当后者被减数变为0时,说明不是字符重排

实现代码:

class Solution {
public:bool CheckPermutation(string s1, string s2) {if (s1.size() != s2.size()) {return false;}//统计s2中各个字符出现的次数int hash[26] = { 0 };for (auto s : s1) {hash[s - 'a']++;}//比较s1和s2之间字符个数是否相同for (auto s : s2) {hash[s - 'a']--;//出现0说明s1中出现的s2中没有,因此不互为重排字符if (hash[s - 'a'] < 0) {return false;}}return true;}
};

三:存在重复元素

题目要求:

解题思路:

思路:本题和第一题的思路相似,定义一个哈希表——unordered_set<int>(因为只需比较是否为相同数字,不需要返回下标),定义一个变量i遍历数组nums,查找当前i位置处的值在哈希表中是否存在,若存在,则返回true,不存在则将当前i位置处的值插入到哈希表中,i++

实现代码:

class Solution {
public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> hash;for(int i = 0; i < nums.size(); i++) {if(hash.count(nums[i])) {return true;}hash.insert(nums[i]);}return false;}
};

四:存在重复元素Ⅱ

题目要求:

解题思路:

思路:本题和第三题思路类似,本题需要用到数组下标,因此用于辅助计算的哈希表应定义为unordered_map<int,int> hash;同样定义变量i遍历数组,查找当前i位置处的值在哈希表中是否存在,且是否满足abs(i - hash[nums[i]]) <= k,若满足,则返回答案,若不满足,则将当前i位置处的值插入到哈希表中

细节:注意到,数组中可能会出现重复数字,但是通过hash[nums[i]] = i;可以覆盖先前的数字对应的下标,因此本题中该细节问题不会对最终答案造成影响,但如果是abs(i - hash[nums[i]]) >= k,就需要处理这个细节问题。

实现代码:

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

五:字母异位词分组

题目要求:

解题思路:

思路:本题的大致解法思路和第一题类似,更考察个人对STL接口的熟练度。

定义一个哈希表——unordered_map<string,vector<string>> hash;定义一个变量i遍历字符串数组strs,定义一个字符串遍历tmp,将当前i位置处的字符串赋值给tmp后,通过sort对当前i位置处的字符串进行排列,插入到哈希表中,这样哈希表的second位置处,记录的就是题目所需的最终答案。

最后定义一个字符串数组——vector<vector<string>> ret; 遍历hash,将second处的值插入到ret中得到最终结果。

实现代码:

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string,vector<string>> hash;for(int i = 0; i < strs.size(); i++) {string tmp = strs[i];sort(strs[i].begin(),strs[i].end());          hash[strs[i]].push_back(tmp);}vector<vector<string>> ret;for(auto& [x,y] : hash) {ret.push_back(y);}return ret;}
};


http://www.ppmy.cn/embedded/162058.html

相关文章

如何将网站提交百度收录完整SEO教程

百度收录是中文网站获取流量的重要渠道。本文以我的网站&#xff0c;www.mnxz.fun&#xff08;当然现在没啥流量&#xff09; 为例&#xff0c;详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…

ubuntu下一键编译

最近想在ubuntu下练习练习c语言&#xff0c;使用了vscode编写代码&#xff0c;然后使用gcc -test.c -o test && .\test的组合&#xff0c;但是感觉每次都要敲一遍这个指令非常的麻烦&#xff0c;搜索后使用了在文件夹下添加Makefile文件&#xff0c;实现只要敲make就可…

Cesium for Unity Linux版本

Cesium for Unity 直装不支持Linux 参照官方开发流程一些操作命令issues 宝藏最后运行图 参照官方开发流程 https://github.com/CesiumGS/cesium-unity/blob/main/Documentation~/developer-setup.md 系统已经安装过dotnet和cmake xuefeixuefei:~$ dotnet --version 9.0.102 …

MongoDB基础入门

什么是Mongodb MongoDB是NoSQL数据库中的佼佼者&#xff0c;目前是排名第一的文档型数据库。该数据库基于灵活的JSON文档模型&#xff0c;非常适合敏捷式的快速开发。与此同时&#xff0c;其与生俱来的高可用、高水平扩展能力使得它在处理海量、高并发的数据应用时颇具优势。 …

pytest测试专题 - 1.2 如何获得美观的测试报告

<< 返回目录 1 pytest测试专题 - 1.2 如何获得美观的测试报告 1.1 背景 虽然pytest命令的报文很详细&#xff0c;用例在执行调试时还算比较方便阅读和提取失败信息&#xff0c; 但对于大量测试用例运行时&#xff0c;可能会存在以下不足 报文被冲掉测试日志没法归档 …

AI时代前端开发的沟通与协作:效率与人性的平衡

在飞速发展的AI时代&#xff0c;前端开发面临着前所未有的挑战。技术日新月异&#xff0c;项目复杂度不断攀升&#xff0c;对团队的沟通与协作能力提出了更高的要求。高效的沟通与协作不再是锦上添花&#xff0c;而是决定项目成败的关键因素&#xff0c;直接影响着开发效率和最…

物联网(IoT)如何与人工智能(AI)的结合

物联网&#xff08;IoT&#xff09;与人工智能&#xff08;AI&#xff09;的结合是当前技术发展的重要趋势&#xff0c;通常被称为 AIoT&#xff08;人工智能物联网&#xff09;。这种结合通过将AI的计算能力和数据分析能力与物联网的海量设备连接能力相结合&#xff0c;实现了…

Datawhale 数学建模导论二 2025年2月

第6章 数据处理与拟合模型 本章主要涉及到的知识点有&#xff1a; 数据与大数据Python数据预处理常见的统计分析模型随机过程与随机模拟数据可视化 本章内容涉及到基础的概率论与数理统计理论&#xff0c;如果对这部分内容不熟悉&#xff0c;可以参考相关概率论与数理统计的…