哈希表基础
哈希表可以为数组、set(集合)、map(映射)来实现。
242.有效的字母异位词
数组作为哈希表来存储每个字母出现的次数。
class Solution {
public:
bool isAnagram(string s, string t) {
int count1[26] = {0};
for(int i = 0; i < s.size(); i++) {
count1[s[i] - 'a']++;
}
for(int i = 0; i < t.size(); i++) {
count1[t[i] - 'a']--;
}
for(int i = 0; i < 26; i++) {
if(count1[i] != 0) {
return false;
}
}
return true;
}
};
349. 两个数组的交集
unordered_set解决无序、无重复数据的问题。
创建:unordered_set nums_set(nums1.begin(), nums1.end()),直接将nums1数组中的数全部加入进set中,无序且无重复。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for(int i = 0; i < nums2.size(); i++) {
if(nums_set.find(nums2[i]) != nums_set.end()) {
result_set.insert(nums2[i]);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
202. 快乐数
每次求和后加入set中,若出现重复的和,说明进入了死循环,得不到和为1的结果。
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> sum_set;
int sum;
while(1) {
sum = getSum(n);
n = sum;
if(sum == 1) {
return true;
}
if(sum_set.find(sum) != sum_set.end()) {
return false;
}
sum_set.insert(sum);
}
}
int getSum(int x) {
int sum = 0;
while(x != 0) {
sum += (x % 10) * (x % 10);
x /= 10;
}
return sum;
}
};
1. 两数之和
力扣第一题!梦开始的地方!
unordered_map来保存,key对应nums的值,value对应下标。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> umap;
for(int i = 0; i < nums.size(); i++) {
auto iter = umap.find(target - nums[i]);
if(iter != umap.end()) {
return {iter->second, i};
}
umap.insert(pair<int, int>(nums[i], i));
}
return {};
}
};