今日任务
- 哈希表理论基础
- 242.有效的字母异位词
- 349. 两个数组的交集
- 202. 快乐数
- 1. 两数之和
一、理论基础
一般哈希表都是用来快速判断一个元素是否出现在集合中。
常见哈希结构:数组、集合(set)、映射(map)
哈希法是用空间换取了时间。
附上链接:代码随想录
二、有效的字母异位词
题目解读:这道题的大致意思就是看两个单词的组成字母是不是一样的。
可以用哈希表做,但是用数组应该会更简单一点。
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']++;
}
for(int i = 0; i<t.size();i++){
record[t[i]-'a']--;
}
for(int i = 0;i<26;i++){
if(record[i] != 0){
return false;
}
}
return true;
}
};
其实也可以用哈希,但用数组明显感觉亲切一点,感觉就是熟练度不够
附上题解:代码随想录
三、两个数组的交集
这个题是比较简单的哈希应用吧
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> nums;
unordered_set<int> nu1(nums1.begin(),nums1.end());
for(int num : nums2){
if(nu1.find(num)!=nu1.end()){
nums.insert(num);
}
}
return vector<int>(nums.begin(),nums.end());
}
};
主要是格式的应用
四、快乐数
题目解读:首先需要一个求它的算法的函数,需要自己写,没有太多困难。之后再把出现的数加入哈希表,重合的数就说明他无限循环了。
class Solution { public: int getSum(int n){ int sum = 0; while(n){ sum += (n%10)*(n%10); n/=10; } return sum; } bool isHappy(int n) { unordered_set<int> set; while(1){ int sum = getSum(n); if(sum ==1){ return true; } if(set.find(sum)!= set.end()){ return false; } else{ set.insert(sum); } n = sum; } } };
主要问题还是逻辑不是太清晰。
五、两数之和
这题可以暴力解,但是很low,因为涉及到了两个整数、以及他们的下标、所以应该使用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++){
auto temp = res.find(target- nums[i]);
if(temp!=res.end()){
return {temp->second,i};
}
else{
res.insert(pair<int,int>(nums[i],i));
}
}
return {};
}
};
完事下班。