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

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 {};
    }
};
相关推荐
好悬给我拽开线3 小时前
ZILOT 论文解析
算法
饮水桶_T4 小时前
JAVA IO流笔记
开发语言·数据结构·算法
星夜离尘565 小时前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Pniubi5 小时前
力扣76.最小覆盖子串
算法·leetcode·职场和发展
地平线开发者6 小时前
征程6|用 hrt\_model\_exec 看清 YOLOv5x 的输入、原始输出和后处理
人工智能·算法
csdn_aspnet7 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
赤生云电竞7 小时前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
青少儿编程课堂8 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
Oneshot11 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法
文丑颜不良啊11 小时前
LeetCode2541~2560题目解析
java·leetcode