理论基础:
能用来干什么? 哈希表都是用来快速判断一个元素是否出现在集合里.
涉及到的哈希函数 哈希碰撞 线性探测法和拉链法 待后续用到时深入理解
常见的哈希结构:数组 集合set 映射map
242.有效的字母异位词 :有效的字母异位词
思考:
就是希望这两个字符串出现的字符数量及种类都相同,怎样快速判断? 26个英文字母是有限的,直接比较这两个字符串中不同字母的出现次数即可;
字母顺序用0-26,比较出现次数可以用加减法实现,即一个字符串++,另一个字符串--,最后看总体的记录结果是怎样.
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 i = 0; i < 26; i++) {
if(record[i] != 0) return false;
}
return true;
}
349. 两个数组的交集 :两个数组的交集
由于是前期不是很了解,本次是参照得出的,因此只将学到的知识点记录下来.
整体思路,将一个数组转换为哈希表,遍历另一个数组,并将两者进行判断(find函数),如果能够在哈希表中找到,则说明存在交际,即存储起来.
又因交集中无重复结果,并且unordered_set读写效率最高,因此选择该数据结构
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> nums1_set(nums1.begin(), nums1.end());
for(int num : nums2) {
if(nums1_set.find(num) != nums1_set.end()) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
202. 快乐数:快乐数
根据题目要求,需要进行求和操作; 另外就是一个循环结构,即(求和->判断是否为1(true 结束),(不唯一则要判断是否陷入循环,或者继续求和))
本次的哈希表即运用在判断是否重复上面,.记录下每个不为1的结果,并提供下一次的判断;
int getSum (int a) {
int sum = 0;
while (a) {
sum += (a % 10) * (a % 10);
a /= 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> record;
while(n) {
int temp = getSum(n);
if(temp == 1) {
return true;
} else if(record.find(temp) != record.end()) {
break;
}else {
record.insert(temp);
}
n = temp;
}
return false;
}
1. 两数之和 :两数之和
思路:
判断是否有满足要求的两个加数,将求和转换为求差,即target 与 nums[i] 做差进行计算,然后判断是由有满足条件的已经在里面了
要求返回下标,应该采用key - value的组合,即map
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> map;
for(int i = 0; i < nums.size(); i++) {
auto iter = map.find(target - nums[i]);
if(iter != map.end()) { //判断是否找到合适的结果
return {iter->second, i};
}
map.insert(pair<int, int>(nums[i], i)); //没有则将本次的结果放进去存储
}
return {};
}