目录
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;elsehash.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;}
};