今日任务
- 哈希表理论基础
- 242.有效的字母异位词
- 349. 两个数组的交集
- 202. 快乐数
- 1. 两数之和
详细布置
哈希表理论基础
哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。
什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
文章讲解:代码随想录
242.有效的字母异位词
数组形式的哈希表
class Solution {
public:
bool isAnagram(string s, string t) {
int harsh[26];//记录26位字母出现次数
for(int i = 0; i < s.size(); i++){//遍历字符串数组
harsh[s[i]-'a']++;
}
for(int i = 0; i < t.size(); i++){
harsh[t[i]-'a']--;
}
for(int i = 0; i < 26; i++){
if(harsh[i] != 0){
return false;
}
}
return true;
}
};
题目链接/文章讲解/视频讲解: 代码随想录
349. 两个数组的交集
建议:本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。
set语法不熟悉
迭代器(Iterator)是 C++ 标准库中的一个概念,它相当于一种指针,可以用于遍历容器中的元素。
nums_set.find(num)
函数返回的是一个迭代器,指向 nums_set 中值为 num 的元素(如果存在)。如果该函数返回的迭代器等于 nums_set.end(),则表示 nums_set 中没有找到值为 num 的元素。
因此,通过 nums_set.find(num) != nums_set.end()
来判断 num 是否存在于 nums_set 中。如果条件成立,则说明 num 存在于 nums_set 中,也就意味着它同时存在于 nums1 中,因此将其插入到 result_set 中。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result;//存放集合结果
unordered_set<int> num_set(nums1.begin(),nums1.end());
for(int i = 0; i < nums2.size(); i++){
if(num_set.find(nums2[i]) != num_set.end()){
result.insert(nums2[i]);
}
}
return vector<int>(result.begin(),result.end());
}
};
题目链接/文章讲解/视频讲解:代码随想录
202. 快乐数
建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子
注意set.find()和set.end()的用法
class Solution {
public:
int getSum(int n){//计算输入n的各位置元素的平方和
int sum = 0;
while(n){
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> set;//只去重,但不排序
while(1){
int sum = getSum(n);
if(sum == 1){
return true;
}
if(set.find(sum) != set.end()){
return false;
}else{
set.insert(sum);
}
n = sum;
}
}
};
题目链接/文章讲解:代码随想录
1. 两数之和
建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,set之后,使用map解决哈希问题的第一题。
暴力解
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++){
for(int j = i + 1; j < nums.size(); j++){
if(nums[i] + nums[j] == target){
return {i,j};
}
}
}
return {};
}
};
题目链接/文章讲解/视频讲解:代码随想录