关键内容:哈希表,三种哈希结构

官方说法:哈希表是根据关键码的值而直接进行访问的数据结构。
用途:一般哈希表都是用来快速判断一个元素是否出现集合里。
哈希本质就是牺牲空间换取时间

三种常见哈希结构:

  • 数组
  • set
  • map

代码随想录中关于这三种结构的解读

242,使用了数组作为hash表,注意下标问题。若是大小写,则数组长度更大。

class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26]={0};
        for (int i=0;i<s.size();i++)
        {
            record[s[i]-'a']+=1;            //开始record【】内未-‘a’,此处是用了一个相对数值
        }
        for (int i=0;i<t.size();i++)
        {
            record[t[i]-'a']-=1;
        }
        for (int i=0;i<26;i++)
        {
            if(record[i]!=0)
            return false;
        }
        return true;
    }
};

349 set中的unorderd_set的使用。set与map中unordered的那一种通常查询和增删效率更高。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
      //  vector<int> result;
        int hash[1001]={0};         //val在1-1000,数组容量应至少1001除非后面存储val-1
        unordered_set<int> p;
        for (int i : nums1)         //注意,i不是nums1的index,而是值;
        {
            hash[i]=1;
        }
        for (int i : nums2)
        {
            if(hash[i]==1)
            {
                p.insert(i);     //注意插入函数insert
            }
        }
        return vector<int>(p.begin(),p.end());  //vector的构造方式之一
    }
};

202,242的拓展

class Solution {
public:
    bool isHappy(int n) {
        unordered_set<int> result;
        int x=n;
        int ry;
        int ans=0;
        while(1)
        {
            while(x>0)
            {
                ry=x%10;
                x=x/10;
                ans+=ry*ry;
            }
            if(ans==1)
            {
                return true;
            }
            if(result.find(ans)!=result.end())      //此处if内的写法注意,这是用来判断一个元素是否在set内
            {
                return false;
            }
            result.insert(ans);
            x=ans;
            ans=0;
        }
    }
};
  1. l用unordered_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]);          //此处只有用auto,才能不犯类型不匹配的错误; 
            if(iter != map.end()) {
                return {iter->second, i};        
            }
            // 如果没找到匹配对,就把访问过的元素和下标加入到map中
            map.insert(pair<int, int>(nums[i], i)); 
        }
        return {};

        
    }
};

总结:
当需要快速判断一个元素是否是在表中时,应想到是不是可以用哈希表;
三种哈希结构应熟练掌握;