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

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;
    }
};

要理解si-'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 {};
    }
};
相关推荐
小宋加油啊4 小时前
机械臂抓取物体 PVN3D算法调研学习
学习·算法·3d
lqqjuly4 小时前
前沿算法深度解析(一)
算法
小欣加油5 小时前
leetcode1926 迷宫中离入口最近的出口
数据结构·c++·算法·leetcode·职场和发展
happymaker06267 小时前
LeetCodeHot100——42.接雨水
算法
阿正的梦工坊8 小时前
【Rust】07-错误处理:Option、Result 与 ? 运算符
开发语言·算法·rust
八解毒剂9 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
运行时记录9 小时前
别再手动写提示词了 — SkillOpt 让技能文档自己进化
算法
啦啦啦啦啦zzzz10 小时前
算法总结(二分查找、双指针)
c++·算法
qq_85730581910 小时前
python语法
开发语言·python·算法