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

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 {};
    }
};
相关推荐
颜酱1 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_736919102 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi9878382 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
DuHz2 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理
Polaris北极星少女2 小时前
TRSV优化2
算法
代码游侠3 小时前
C语言核心概念复习——网络协议与TCP/IP
linux·运维·服务器·网络·算法
2301_763472463 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
abluckyboy4 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
园小异4 小时前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展
m0_706653234 小时前
分布式系统安全通信
开发语言·c++·算法