代码随想录算法训练营第六天
LeetCode242. 有效的字母异位词
题目链接:https://leetcode.cn/problems/valid-anagram/
视频讲解:
题解
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int> map(26, 0);
for(int i = 0; i < s.size(); i++) {
map[s[i] - 'a']++;
}
for(int i = 0; i < t.size(); i++) {
map[t[i] - 'a']--;
}
for(int i = 0; i < map.size(); i++) {
if(map[i] != 0) return false;
}
return true;
}
};
总结
LeetCode349. 两个数组的交集
题目链接:https://leetcode.cn/problems/intersection-of-two-arrays/
视频讲解:
题解
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> res_set;
unordered_set<int> nums(nums1.begin(), nums1.end());
for(int i = 0; i < nums2.size(); i++) {
if(nums.find(nums2[i]) != nums.end()) res_set.insert(nums2[i]);
}
return vector<int> (res_set.begin(), res_set.end());
}
};
总结
- 哈希表的使用场景,给定一个元素需要判断他是不是在集合里出现过
- 结果需要进行去重操作,所以先声明
res_set
,然后再声明vector
。
LeetCode202. 快乐数
题目链接:https://leetcode.cn/problems/happy-number/description/
视频讲解:
题解
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> hash;
while(hash.find(n) == hash.end()) {
hash.insert(n);
n = getSum(n);
if(n == 1) return true;
}
return false;
}
int getSum(int x) {
int sum = 0;
while(x) {
int a = x % 10;
sum += a * a;
x /= 10;
}
return sum;
}
};
总结
- 题目中说会无线循环,那么平方和会重复出现,通过这一点来判断是否是快乐数。
- 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑用哈希法。
LeetCode1. 两数之和
题目链接:https://leetcode.cn/problems/two-sum/description/
视频讲解:
题解
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
vector<int> res;
for(int i = 0; i < nums.size(); i++) {
auto it = hash.find(target - nums[i]);
if(it != hash.end()){
return vector<int> {it->second, i};
}else {
hash[nums[i]] = i;
}
}
return {};
}
};
总结
- 本题有四个重点:
- 为什么会想到用哈希表
- 哈希表为什么用map
- 本题map是用来存什么的
- map中的key和value用来存什么的