目录
哈希表是根据关键码的值而直接进行访问的数据结构
什么时候使用哈希法:当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法
解决办法
红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加
要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。
状态:已AC,困在了一直考虑ASCII码上,但其实只要有差值即可
- class Solution {
- public:
- bool isAnagram(string s, string t) {
- int record[26] = {0};
- for (int i = 0; i < s.size(); i++) {
- // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
- 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的用法需要学习
- 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());
- }
- };
状态:已AC,注意set.find(key)的用法
判断sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止
- class Solution {
- public:
- // 取数值各个位上的单数之和
- 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;
- }
- // 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
- if (set.find(sum) != set.end()) {
- return false;
- } else {
- set.insert(sum);
- }
- n = sum;
- }
- }
- };
状态:思路都不清楚,败笔啊,不过看图清楚了,代码待回顾
本题不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适
- class Solution {
- public:
- vector<int> twoSum(vector<int>& nums, int target) {
- std::unordered_map <int,int> map;
- for(int i = 0; i < nums.size(); i++) {
- // 遍历当前元素,并在map中寻找是否有匹配的key
- auto iter = map.find(target - nums[i]);
- if(iter != map.end()) {
- return {iter->second, i};
- }
- // 如果没找到匹配对,就把访问过的元素和下标加入到map中
- map.insert(pair<int, int>(nums[i], i));
- }
- return {};
- }
- };