关键内容:哈希表,三种哈希结构
官方说法:哈希表是根据关键码的值而直接进行访问的数据结构。
用途:一般哈希表都是用来快速判断一个元素是否出现集合里。
哈希本质就是牺牲空间换取时间
三种常见哈希结构:
- 数组
- set
- map
242,使用了数组作为hash表,注意下标问题。若是大小写,则数组长度更大。
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26]={0};
for (int i=0;i<s.size();i++)
{
record[s[i]-'a']+=1; //开始record【】内未-‘a’,此处是用了一个相对数值
}
for (int i=0;i<t.size();i++)
{
record[t[i]-'a']-=1;
}
for (int i=0;i<26;i++)
{
if(record[i]!=0)
return false;
}
return true;
}
};
349 set中的unorderd_set的使用。set与map中unordered的那一种通常查询和增删效率更高。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// vector<int> result;
int hash[1001]={0}; //val在1-1000,数组容量应至少1001除非后面存储val-1
unordered_set<int> p;
for (int i : nums1) //注意,i不是nums1的index,而是值;
{
hash[i]=1;
}
for (int i : nums2)
{
if(hash[i]==1)
{
p.insert(i); //注意插入函数insert
}
}
return vector<int>(p.begin(),p.end()); //vector的构造方式之一
}
};
202,242的拓展
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> result;
int x=n;
int ry;
int ans=0;
while(1)
{
while(x>0)
{
ry=x%10;
x=x/10;
ans+=ry*ry;
}
if(ans==1)
{
return true;
}
if(result.find(ans)!=result.end()) //此处if内的写法注意,这是用来判断一个元素是否在set内
{
return false;
}
result.insert(ans);
x=ans;
ans=0;
}
}
};
- l用unordered_map解决,需要注意该结构的一些用法,以及返回的时候的形式。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map <int,int> map;
for(int i = 0; i < nums.size(); i++) {
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter = map.find(target - nums[i]); //此处只有用auto,才能不犯类型不匹配的错误;
if(iter != map.end()) {
return {iter->second, i};
}
// 如果没找到匹配对,就把访问过的元素和下标加入到map中
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};
总结:
当需要快速判断一个元素是否是在表中时,应想到是不是可以用哈希表;
三种哈希结构应熟练掌握;