哈希表理论基础:
文章讲解:代码随想录
自己的思考:哈希表和数组很类似,数组可以直接根据下标访问相应的元素,哈希表也是一样的,我们可以通过哈希函数把元素映射到哈希表中,成为哈希表中的索引
题目:● 242.有效的字母异位词
题目链接/文章讲解/视频讲解: 代码随想录
第一想法:利用哈希的方法,遍历第一个字符,把每一个字符放在哈希表中,当作索引,值放入的是该字符出现的次数;遍历第二个字符,把字符对应的索引对应的值遇到一次减少一次,然后遍历map,如果为0,return true
看完代码随想录之后的想法:
原来可以不用使用map,直接可以使用数组,用数组的索引当作字符,默认值都为0-,意味着字符不存在,然后操作思想依旧是哈希思想;
题目:● 349. 两个数组的交集
题目链接/文章讲解/视频讲解: 代码随想录
第一想法:使用两个set
看完代码随想录之后的想法:使用一个set,但是set.find()的时间复杂度是log(n);
代码:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for (int num : nums2) {
// 发现nums2的元素 在nums_set里又出现过
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
还有一个双指针的方法,效率更高,空间复杂度会更低;
代码:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
vector<int> res;
int i = 0;
int j = 0;
int pre = -1;
while(i < nums1.size() && j < nums2.size()) {
if(nums1[i] == nums2[j])
{
if(nums1[i] != pre) {
res.push_back(nums1[i]);
pre = nums1[i];
}
i++;
j++;
}
else if(nums1[i] < nums2[j])
i++;
else
j++;
}
return res;
}
};
题目:202. 快乐数
题目链接/文章讲解:代码随想录
还挺好过的,只不过有点细节需要注意
还有一种双指针的方法;
题目:1. 两数之和
题目链接/文章讲解/视频讲解:代码随想录
这道题还可,不是挺难的;
总结:今天学习到了哈希表的原理,就是对一个元素,通过一个哈希函数进行一对一的映射,就相当于该元素映射成为了一个索引,我们访问数组的时候,我们是通过索引直接可以访问到了相对应的值,因此我们哈希也就可以通过元素映射成索引直接访问到该元素所对应的值;
但是我们要注意set.find()这个函数时间复杂度为log(n);