代码随想录算法训练营day6-哈希表part1

有效字母的异位词

原题链接:有效的字母异位词

思路:先判断二者长度是否相等,利用unordered_map,记录各个字母出现的次数,在另一个字符串中,减去出现的次数,当某个字符出现次数为负数时,则不匹配

class Solution {
public:
    bool isAnagram(string s, string t) {
        if(s.size() != t.size())
            return false;

        unordered_map<char,int> m;
        for(auto i : s) m[i]++;
        
        for(auto i : t){
            m[i]--;
            if(m[i]<0){
                return false;
            }
        }

        return true;
    }
};

 两个数组的交集

原题链接:两个数组的交集

思路:判断交集,重复出现的问题,可以考虑利用哈希表,哈希表常见有三种应用:数组,set,map。这里由于数据范围较小,可以使用数组,利用下标判断该元素是否出现。也可以使用集合去重,然后遍历一个集合,去判断是否重复。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        //数组
         vector<int>res;

        // bool temp[1005]{false};
        // for(auto i:nums1) temp[i]=true;
        // for(auto i:nums2) {
        //     if(temp[i] == true){
        //         res.push_back(i);
        //         temp[i] = false;
        //     }
        // }


        //set
        unordered_set<int> s1,s2;
        for(auto i : nums1) s1.insert(i);    //去重
        for(auto i : nums2) s2.insert(i);

        for(auto i : s2){
            if(s1.find(i)!=s1.end()){
                res.push_back(i);
            }
        }
        
        return res;
    }
};

 快乐数

原题链接:快乐数

思路:什么情况下无法得到1呢?我们知道,int长度有限,每位数平方和存在最大值。如果一个数永远无法成为1,那么必定出现重复循环,利用哈希表来检测重复。

class Solution {
public:
    unordered_set<int>m;
    bool isHappy(int n) {
        if(m.find(n) != m.end()){
            return false;
        }

        int sum = 0;
        int t = n;
        while(n!=0){
            int temp = n%10;
            n/=10;
            sum+=temp*temp;
        }

        if(sum == 1){
            return true;
        }else{
            m.insert(t);
            return isHappy(sum);
            //2 , 4 , 16 , 37, 58, 89 , 145 , 42 , 20 , 4
        }
    }
};

 两数之和

原题链接:​​​​​​​两数之和

思路:容易想到,使用两层for循环遍历。抽象一下,题目关键在于我们需要找到某个数在数组中是否存在,容易想到使用哈希表。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
       
        unordered_map<int,int> m;
        for(int i = 0;i<nums.size();i++){
            int temp = target-nums[i];
            if(m.find(temp) != m.end()){
                return{i,m.find(temp)->second};
            }
            m[nums[i]] = i;
        }
        return {};
  
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值