代码随想录算法训练营Day5(LeetCode242 有效的字母异位词;LeetCode349 两个数组的交集;LeetCode202 快乐数 ;LeetCode1 两数之和)
;LeetCode1 两数之和))
LeetCode242 有效的字母异位词
题目链接:有效的字母异位词(https://leetcode.cn/problems/valid-anagram/description/)
文档讲解:代码随想录(https://programmercarl.com)
做题情况
这道题没想过可以用哈希表做,现在仔细思考一下题目,它其实就是判断s中的每一个元素是否在t中,因此就可以想到哈希表。由于只有小写字母,因此可以通过ASCII码构成一个天然映射,将 ‘a’ 到 ‘z’ 映射到 0-25 ,等同于 ordered_set 。
下面是代码:
bool isAnagram(string s, string t) {
int hashArray[26] = {0};
for (int i = 0; i < s.size(); i++) {
hashArray[s[i] - 'a']++;
}
for (int i = 0; i < t.size(); i++) {
hashArray[t[i] - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (hashArray[i] != 0) {
return false;
}
}
return true;
}
LeetCode349 两个数组的交集
题目链接:两个数组的交集(https://leetcode.cn/problems/intersection-of-two-arrays/)
文档讲解:代码随想录(https://programmercarl.com)
做题情况
这道题使用数组的话,就是通过id映射,在 [0, 1000] 的范围限制内还是可以求解的,但是再大一些就会造成大量的空间浪费。这里直接使用 unordered_set ,通过这道题初步了解了 set 的一般用法。
下面是代码:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> res_set;
unordered_set<int> nums1_set(nums1.begin(), nums1.end());
for (int num : nums2) {
if (nums1_set.find(num) != nums1_set.end()) {
res_set.insert(num);
}
}
return vector<int>(res_set.begin(), res_set.end());
}
LeetCode202 快乐数
题目链接:快乐数(https://leetcode.cn/problems/happy-number/description/)
文档讲解:代码随想录(https://programmercarl.com)
做题情况
这道题直接用 unorderset 就能求解了,因为最后就是判断为1就返回 True ,为原始数n就返回 False。注意各个位置数字平方和的写法就好了。
以下是代码:
bool isHappy(int n) {
unordered_set<int> num_set;
while (n != 1) {
if (num_set.find(n) != num_set.end()) return false;
num_set.insert(n);
int tmp = 0;
while (n) {
tmp += (n % 10) * (n % 10);
n /= 10;
}
n = tmp;
}
return true;
}
LeetCode1 两数之和
题目链接:两数之和(https://leetcode.cn/problems/two-sum/)
文档讲解:代码随想录(https://programmercarl.com)
做题情况
这道题使用 unordered_map ,原因有二:一是我需要查找数组当前遍历的值的差值是否出现过,因此需要使用哈希表;二是这里需要索引而不是我们找到的值,因此需要使用 nums[i] -> i 的 map ;三是这里的 nums[i] 不需要排序,因此只用 unordered 。另外在实现的时候,要注意我们是用当前的差值去查过去的值 (而不是值的差值) 是否存在,要注意查的值是 diff 和插入的值是 nums[i] ;最后要注意数组的构造方式,一开始我写成了 std::vector(sum_index_map[diff], i) ,它的意思是指构造一个包含 sum_index_map[diff] 个值为 i 的vector,这显然错误了。
以下是代码:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> sum_index_map;
for (int i = 0; i < nums.size(); i++) {
int diff = target - nums[i];
if (sum_index_map.find(diff) != sum_index_map.end()) {
return {sum_index_map[diff], i};
}
else {
sum_index_map[nums[i]] = i;
}
}
return { };
}
1134

被折叠的 条评论
为什么被折叠?



