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

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 {};
    }
};
相关推荐
ChoSeitaku2 小时前
28.C++进阶:map和set封装|insert|迭代器|[]
java·c++·算法
爱编码的傅同学2 小时前
【今日算法】LeetCode 5.最长回文子串 和 287.寻找重复数
算法·leetcode·代理模式
张祥6422889042 小时前
GNSS单点定位方程推导笔记
人工智能·算法·机器学习
吴秋霖2 小时前
某网站x-s补环境(Cursor版)
算法·js逆向·cursor·补环境
炽烈小老头2 小时前
【每天学习一点算法 2026/01/20】汉明距离
学习·算法
夏鹏今天学习了吗2 小时前
【LeetCode热题100(86/100)】最长有效括号
算法·leetcode·职场和发展
踩坑记录2 小时前
leetcode hot100 73.矩阵置零 medium
leetcode
小龙报2 小时前
【初阶数据结构】解锁顺序表潜能:一站式实现高效通讯录系统
c语言·数据结构·c++·程序人生·算法·链表·visual studio
有一个好名字2 小时前
力扣-删除二叉搜索树的节点
算法·leetcode·职场和发展