-
学习一下哈希表的理论基础:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E5%93%88%E5%B8%8C%E5%87%BD%E6%95%B0
哈希表遇到哈希碰撞时,主要是拉链法和线性探测法; -
开始做题
242.有效的字母异位词
这道题就是用C++的STL数据结构:unordered_map做,用数组做也可以,毕竟字符串只包含小写字母class Solution { public: bool isAnagram(string s, string t) { unordered_map<char,int> res; for(auto e:s) { res[e]++; } for(auto e:t) { if(!(res.count(e)>0)) { return false; }else if(res[e]<1) { return false; } res[e]--; } for(auto e:res) { if(e.second>0) return false; } return true; } };
349.两个数组的交集
用两个unordered_map来记录一下出现过的字符,同时可以过滤掉重复字符;class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_map<int,int> nums1_,nums2_; for(auto e:nums1) { nums1_[e]=1; } for(auto e:nums2) { nums2_[e]=1; } vector<int> result; for(auto e:nums1_) { if(nums2_.count(e.first)>0) { result.push_back(e.first); } } return result; } };
202.快乐数
这题主要是看如何退出循环class Solution { public: bool isHappy(int n) { unordered_set<int> res; res.insert(n); while(n!=1) { int a=n; int num=0; while(a){ int t=a%10; a=a/10; num+=pow(t,2); } if(res.count(num)>0) return false; res.insert(num); // cout<<num<<endl; n=num; } return true; } };
1.两数之和
这题不用将全部的数和下标都存到map之后再去寻找,可以边存边找,毕竟可以存在的话,前面一定存在对应的数。class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int,int> res; for(int i=0;i<nums.size();i++) { int tar=target-nums[i]; if(res.count(tar)>0) { return {i,res[tar]}; } res[nums[i]]=i; } return {}; } };
哈希表与set、map
最新推荐文章于 2024-11-01 15:19:21 发布
文章介绍了哈希表的基本理论,包括处理哈希碰撞的拉链法和线性探测法,并展示了在解决编程题目的实际应用,如有效字母异位词、两数组交集、快乐数问题以及两数之和问题的解决方案,强调了unordered_map等数据结构的使用效率。
摘要由CSDN通过智能技术生成