代码随想录第六天:哈希表

242. 有效的字母异位词

复制代码
class Solution {
public:
    bool isAnagram(string s, string t) {
        int arr[26]={0};
        for(int i=0;i<s.size();i++)
        {
            arr[s[i]-'a']++;
        }
        for(int i=0;i<t.size();i++)
        {
            arr[t[i]-'a']--;
        }
        for(int i=0;i<26;i++)
        {
            if(arr[i]!=0)
            {
                return false;
            }
        }
        return true;
    }
};

要理解s[i]-'a',首先要明白字符的本质是整数

字符实际上是整数类型,字符之间的运算就是整数运算;

383. 赎金信

复制代码
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int arr[26]={0};
        for(int i=0;i<ransomNote.size();i++)
        {
            arr[ransomNote[i]-'a']++;
        }
        for(int i=0;i<magazine.size();i++)
        {
            arr[magazine[i]-'a']--;
        }
        for(int i=0;i<26;i++)
        {
            if(arr[i]>0)
            {
                return false;
            }
        }
        return true;
    }
};

349. 两个数组的交集

set容器插入只有insert

分为三种类型set不允许有重复的元素,multiset允许有重复的元素,底层实现是红黑树,是有序的

unordered_set底层实现是哈希表,查找效率更高,数值不允许重复,是无序的

1.由于数组大小为1000所以可以使用数组

复制代码
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        int arr[1001]={0};
        for(int i=0;i<nums1.size();i++)
        {
            for(int j=0;j<nums2.size();j++)
            {
                if(nums1[i]==nums2[j])
                {
                    arr[nums1[i]]++;
                }
            }
        }
        vector<int> temp;
        for(int i=0;i<1001;i++)
        {
            if(arr[i]>0)
            {
                temp.push_back(i);
            }
        }
        return temp;
        
    }
};

2.使用set容器

复制代码
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        set<int> s2(nums2.begin(),nums2.end());
        set<int> s1(nums1.begin(),nums1.end());
        vector<int> arr;
        for(int val:s2)
        {
            if(s1.find(val)!=s1.end())
            {
                arr.push_back(val);
            }
        }
        return arr;
    }
};

这道题目也可以使用unordered_set,s1.fin(val)是看s1容器中是否有等于val的元素,如果有返回指向该元素迭代器,如果没有返回s1.end()

202. 快乐数

由于题目中说了可能无限循环所以我们要进行判断是否早已经出现了这个数,所以我们应该用哈希表进行判断

复制代码
class Solution {
public:
    int getsum(int n)
    {
        int sum=0;
        while(n)
        {
            sum=(n%10)*(n%10)+sum;
            n=n/10;
        }
        return sum;
    }
    bool isHappy(int n) {

        if(n==1)
        {
            return true;
        }
        
        int sum=0;
        unordered_set<int> s;
        while(1)
        {
            sum=getsum(n);
            if(sum==1)
            {
                return true;
            }
            else
            {
                if(s.find(sum)!=s.end())
                {
                    return false;
                }
                else
                {
                    s.insert(sum);
                }
            }
            n=sum;
        }
    }
};

不要忘记改变数值n=sum

1. 两数之和

1,暴力解法

复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> temp;
        for(int i=0;i<nums.size();i++)
        {
            for(int j=i+1;j<nums.size();j++)
            {
                if(nums[i]+nums[j]==target)
                {
                    temp.push_back(i);
                    temp.push_back(j);
                }
            }
        }
        return temp;
    }
};

2.每当我们需要判断一个元素曾经是否出现过我们就要思考是否使用哈希表的方法

复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> m;

        for(int i=0;i<nums.size();i++)
        {
            auto it=m.find(target-nums[i]);
            if(it!=m.end())
            {
                return {it->second,i};
            }
            else
            {
                m.insert(pair<int,int>(nums[i],i));
            }
        }
        return {};
    }
};
相关推荐
代码游侠14 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
想进个大厂14 小时前
代码随想录day37动态规划part05
算法
sali-tec14 小时前
C# 基于OpenCv的视觉工作流-章22-Harris角点
图像处理·人工智能·opencv·算法·计算机视觉
子春一14 小时前
Flutter for OpenHarmony:构建一个 Flutter 四色猜谜游戏,深入解析密码逻辑、反馈算法与经典益智游戏重构
算法·flutter·游戏
人道领域15 小时前
AI抢人大战:谁在收割你的红包
大数据·人工智能·算法
TracyCoder12315 小时前
LeetCode Hot100(34/100)——98. 验证二叉搜索树
算法·leetcode
A尘埃15 小时前
电信运营商用户分群与精准运营(K-Means聚类)
算法·kmeans·聚类
power 雀儿16 小时前
掩码(Mask)机制 结合 多头自注意力函数
算法
会叫的恐龙16 小时前
C++ 核心知识点汇总(第六日)(字符串)
c++·算法·字符串
小糯米60116 小时前
C++顺序表和vector
开发语言·c++·算法