代码随想录算法训练营day6|242.有效的字母异位词、349.两个数组的交集、202.快乐数
建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set?和map。??
什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。??这句话很重要,大家在做哈希表题目都要思考这句话。?
文章讲解:代码随想录
?242.有效的字母异位词?
建议:?这道题目,大家可以感受到?数组?用来做哈希表?给我们带来的遍历之处。?
题目链接/文章讲解/视频讲解:?代码随想录
?349.?两个数组的交集?
建议:本题就开始考虑?什么时候用set?什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和?测试用例,添加了?0?<=?nums1[i],?nums2[i]?<=?1000?条件,所以使用数组也可以了,不过建议大家忽略这个条件。?尝试去使用set。?
题目链接/文章讲解/视频讲解:代码随想录
?202.?快乐数?
建议:这道题目也是set的应用,其实和上一题差不多,就是?套在快乐数一个壳子?
题目链接/文章讲解:代码随想录
?1.?两数之和?
建议:本题虽然是?力扣第一题,但是还是挺难的,也是?代码随想录中?数组,set之后,使用map解决哈希问题的第一题。?
建议大家先看视频讲解,然后尝试自己写代码,在看文章讲解,加深印象。?
题目链接/文章讲解/视频讲解:代码随想录
? ? ? ? 使用哈希法,用数组来做哈希表。字符为key,建立key与index的映射,然后value为key出现的次数。
映射关系index=key-‘a’。
c++代码示例如下时间复杂度O(n)、空间复杂度O(1)
bool isAnagram(string s, string t) {
int record[26] = { 0 };
for (int i = 0; i < s.size(); i++) {
record[s[i] - 'a']++;
}
for (int i = 0; i < t.size(); i++) {
record[t[i] - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (record[i] != 0) {
return false;
}
}
return true;
}
? ? ? ? 输出结果中每一个元素都是唯一的,我们使用unordered_set来接受结果,对于unordered_set的初始化可以使用迭代器初始化。
c++代码示例如下? ? ? ? 时间复杂度O(n+m),空间复杂度O(n)
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result;
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for (int num : nums2) {
if (nums_set.find(num) != nums_set.end()) {
result.insert(num);
}
}
return vector<int>(result.begin(), result.end());
}
? ? ? ? 发现题目给的数据的大小0<=nums1[i],nums2[i]<=1000,可以使用大小为1001的数组来做哈希表,数字作为key->index,出现次数为value。还是用unordered_set来接受结果。
c++代码示例如下
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result;
int hash[1001] = { 0 };
for (int num : nums1) {
hash[num] = 1;
}
for (int num : nums2) {
if (hash[num] == 1) {
result.insert(num);
}
}
return vector<int>(result.begin(), result.end());
}
? ? ? ? 难点就是意识到无限循环就是sum重复出现
c++代码示例如下
int getSum(int 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;
}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!