哈希表基础
显著的用途:判断一个元素是否出现在一个集合内。
常见的哈希结构:数组、set、map
unordered_set、 unordered_map
242.有效的字母异位词
思路:由于字符串都是同一个类型的小写字母,故可以直接使用数组作为哈希结构
建立一个长度26即可的数组,遍历字符串,每出现一个字母,就将对应序号的数组元素+1(注意上限不是9),然后再遍历第二个字符串,-1操作
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 j = 0; j<t.size(); j++){
record[t[j] - 'a'] --;
} for(int k = 0; k<26; k++){
if(record[k] != 0){
return false;
}
}return true;
}
};
349. 两个数组的交集
本题由于不像上题可以限定数组的大小只需为26,所以要使用set;
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> num_set(nums1.begin(),nums1.end());
for(int num : nums2){
if(num_set.find(num) != num_set.end()){
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
注意查询是否存在元素的语句:if ( num_set.find (num) != num_set.end() )
1. 两数之和
思路:为了寻找到两数之和为目标值的两个数,可以先将一个数写入哈希表,读取下一个数num时,判断哈希表中是否存在taget-num,如果存在则已经找到这两个数,如果不存在,就将这个数也写入哈希表。
由于题目要求返回下标,所以需要存储一个元素值和对应的下标值,即需要键值对,所以采用map
unorderd_map<int,int> check_map;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> check;
for(int i = 0; i <= nums.size(); i++){
auto iter = check.find(target-nums[i]);
if(iter != check.end()){
return{iter->second,i};
}check.insert(pair<int,int>(nums[i],i));
}return {};
}
};