代码随想录训练营Day6:有效的字母异位词,两个数组的交集,快乐数,两数之和

Hash table

  1. 哈希表/散列表:根据key码的值直接查询访问的数据结构
  2. 当题目要求可以快速判断某值是否在集合里时就可以采用哈希表,采用哈希表的来实现的数据结构查询增删的操作的时间复杂度都是O(1)
  3. 可以是数组,set或者map。比如数组,数组下标就是key,可以通过数据下表访问数组里的值。
  4. 在处理一组数据时,先用哈希函数进行数据的分配,当数据分配到的索引值相等时可以采取拉链法和线性探测法进行再分配。
    不同的情况会采取不同的表达方式,下面请看各道题的分析。

有效字母的异位词

当数据可以连续分配且数量不多的时候可以用数组,因为字符串本身不会太长,而且26个小写英文字母的ASCII码值是连续的可以让数组下标作为哈希表的Key,通过key值去快速查找对应的值,判断该字母是否出过

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']++;
        }
        for(int j=0;j<t.size();j++){
            record[t[j]-'a']--;
        } 
        for(int i=0;i<26;i++){
            if(record[i]!=0)
                return false;
        } 
        return true;      
    }
};

349两个数据的交集

如果nums里边存放的元素太多或者数据跳跃性很大,【1,1,100000】,虽然就三个数字但是却要开辟到100000,所以数组就不合适了,而且题目还要求不重复,unordered set就是无序的不重复的。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result;
        unordered_set<int> nums1_set(nums1.begin(),nums1.end());
        for(int num:nums2){
            if(nums1_set.find(num)!=nums1_set.end())
                result.insert(num);
        }

        return vector<int>(result.begin(),result.end());
    }
};

202快乐数

因为一直在不停计算每次得到的n的各个位上的平方和,所以不确定数据量有多大,所以采取set。
而且需要快速查询这次新得到的数之前是否出现过,所以用哈希表。

class Solution {
public:
    int GotSum(int n){
        int sum=0;
        while(n){
            sum=sum+(n%10)*(n%10);
            n=n/10;
        }
        return sum;
    }
    bool isHappy(int n) {
    unordered_set<int> result;
    int sum;
    while(1){
        sum=GotSum(n);
        if(sum==1) 
            return true;
        if(result.find(sum)!=result.end())
            return false;
        else
            result.insert(sum);
        n=sum;
    }
    }

};

1.两数之和

1.既要返回数值,又要返回下标,所以用map,unordered map(增删查时间复杂度为O(1))
2.key:数值,value:数组下表

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map<int,int> map;
        for(int i;i<nums.size();i++){
            int s=target-nums[i];
            auto iter=map.find(s);
            if(iter!=map.end())
                return {iter->second, i};
            else
                map.insert(pair<int, int>(nums[i], i));
        }
    return {};
    }
};

你可能感兴趣的:(哈希算法,散列表,算法)