目录
1、1. 两数之和
2、面试题 01.02. 判定是否互为字符重排
3、217. 存在重复元素
4、 219. 存在重复元素 II
5、49. 字母异位词分组
频繁查找某一个数的时候可以使用哈希表,哈希表可以使用容器,也可以使用数组模拟,当元素是字符串中的字符或者数据范围很小的时候,可以使用数组模拟哈希表。
1、1. 两数之和
思路:哈希表,边判断边插入。(全部插入再判断,需要判断是排除自身,没有边判断边插入简洁)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
for (int i = 0; i < nums.size(); i++) {
int x = target - nums[i];
if (hash.count(x))
return {hash[x], i};
hash[nums[i]] = i;
}
return {-1, -1};
}
};
2、面试题 01.02. 判定是否互为字符重排
思路:使用一个数组模拟哈希表统计其中一个字符串,然后判断另一个字符串的每个字母在哈希表中减一后,如果出现次数小于0,则不为重排,反之则为重排。
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
if (s1.size() != s2.size())
return false;
int hash[26] = {0};
for (auto s : s1)
hash[s - 'a']++;
for (auto s : s2) {
hash[s - 'a']--;
if (hash[s - 'a'] < 0)
return false;
}
return true;
}
};
3、217. 存在重复元素
思路:借助哈希表边统计边判断。
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> hash;
for (auto n : nums) {
if (hash.count(n))
return true;
else
hash.insert(n);
}
return false;
}
};
4、 219. 存在重复元素 II
思路:使用哈希表统计,key为元素,value为下标。
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, int> hash;
for (int i = 0; i < nums.size(); i++) {
if (hash.count(nums[i])) {
if (i - hash[nums[i]] <= k)
return true;
}
hash[nums[i]] = i;
}
return false;
}
};
5、49. 字母异位词分组
思路:使用string作为哈希表的key,vector<string>作为哈希表的value,将字符串排序后的结果同时作为key和value插入哈希表,由于哈希表的value是字符串数组,所以将哈希表的value导入一个数组即为结果。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> hash;
for (auto& s : strs) {
string tmp = s;
sort(tmp.begin(), tmp.end());
hash[tmp].push_back(s);
}
vector<vector<string>> ret;
for (auto& x : hash) {
ret.push_back(x.second);
}
return ret;
}
};