Day6| 哈希表 242.有效的字母异位词, 349. 两个数组的交集, 202. 快乐数, 1. 两数之和
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
有效的字母异位词
LeetCode题目链接:https://leetcode.cn/problems/valid-anagram/
解题思路
先看题目,可以看成统计两个字符串在长度相同的情况下每个字母出现的次数是否相等。
因此,直接建立两个数组作为两个字符串的哈希表进行存储,并对哈希表进行逐个对比。注意,在构建哈希表时要对哈希表进行初始化,否则随机初始化会引入异常值,使得哈希表查询异常。
代码如下:
class Solution {
public:
bool isAnagram(string s, string t) {
int hashMapS[27] = {0},hashMapT[27]={0};
for(int i=0;i<s.size();i++){
hashMapS[s[i]-'a']++;
}
for(int j=0;j<t.size();j++){
hashMapT[t[j]-'a']++;
}
for(int k=0;k<27;k++){
if(hashMapS[k]!=hashMapT[k]){
return false;
}
}
return true;
}
};
两个数组的交集
LeetCode题目链接:https://leetcode.cn/problems/intersection-of-two-arrays/
解题思路
计算交集同理,构造出一个数组的哈希表,用另一个数组进行查找,如果查询值大于0则说明属于交集元素。
特别注意,因为要求交集元素唯一,所以在查询到一次后,该处元素应该不再被查询,代码上将查询后的哈希值赋值为0。
具体代码如下:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
int hashMap1[1001]={0};
for(int i=0;i<nums1.size();i++){
hashMap1[nums1[i]]++;
}
for(int i=0;i<nums2.size();i++){
if(hashMap1[nums2[i]]>0){
result.push_back(nums2[i]);
hashMap1[nums2[i]]=0;
}
}
return result;
}
};
快乐数
LeetCode题目链接:https://leetcode.cn/problems/happy-number/
解题思路
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为1,那么这个数就是快乐数。
当无限循环的时候,可以看作当数值出现重复时说明进入了循环,此时即可得知是否为快乐数。同时,为了方便数值的拆分计算,可以先把数值转换为string字符串再进行拆分处理。
具体代码如下:
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> hashMap;
int sum=0;
string strN = to_string(n);
while(1){
sum=0;
for(int i=0;i<strN.length();i++){
sum += pow(strN[i]-'0',2);
}
if(sum==1){
return true;
}
if(hashMap.find(sum)==hashMap.end()){
hashMap.insert(sum);
}else{
return false;
}
strN = to_string(sum);
}
}
};
两数之和
LeetCode题目链接:https://leetcode.cn/problems/two-sum/
解题思路
先看题目,要求序号不重复的前提下进行判定两数之和。因此可以在一次循环中,想办法保存之前循环过元素的值和索引。然后每次循环对之前的元素进行查询匹配。
因此涉及到查询,可以使用哈希表进行存储,因为要输出索引,因此存储时应当存储数值和索引两个值的pair。
代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> hashMap;
for(int i=0;i<nums.size();i++){
auto iter = hashMap.find(target-nums[i]);
if(iter!=hashMap.end()){
return vector<int>{iter->second,i};
}
hashMap.insert(pair(nums[i],i));
}
return {};
}
};