五月集训(第七日)哈希表

一、1512. 好数对的数目

1.原题链接

1512. 好数对的数目

2.题目描述

        给你一个整数数组 nums 。如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。返回好数对的数目。

3.解题思路

        运用哈希表,遍历数组,找到满足条件的次数存入ans即可。

4.源码

class Solution {
public:
    int numIdenticalPairs(vector<int>& nums) {
        int ans=0;
        int hash[101];
        memset(hash,0,sizeof(hash));
        for(int i=0;i<nums.size();++i){
            ans+=hash[nums[i]];
            ++hash[nums[i]];
        }
        return ans;
    }
};

二、2006. 差的绝对值为 K 的数对数目

1.原题链接

2006. 差的绝对值为 K 的数对数目

2.题目描述

        给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。|x| 的值定义为:如果 x >= 0 ,那么值为 x 。 如果 x < 0 ,那么值为 -x 。

3.解题思路

        本题与上题类似,也是运用哈希表,注意要找两次。

4.源码

class Solution {
public:
    int countKDifference(vector<int>& nums, int k) {
        unordered_map<int,int> hash;
        int ans =0;
        for(int i =0;i<nums.size();++i){
            ans+=hash[nums[i]+k];
            ans+=hash[nums[i]-k];
            hash[nums[i]]++;
        }
        return ans;
    }
};

三、1347. 制造字母异位词的最小步骤数

1.原题链接

1347. 制造字母异位词的最小步骤数

2.题目描述

        给你两个长度相等的字符串 s 和 t。每一个步骤中,你可以选择将 t 中的 任一字符 替换为 另一个字符。返回使 t 成为 s 的字母异位词的最小步骤数。字母异位词 指字母相同,但排列不同(也可能相同)的字符串。

3.解题思路

        构造两个哈希表,遍历两个字符串,将其存入哈希表中,之后枚举每个字母,并进行比较,如果两个差值为正数,则累加。

4.源码

class Solution {
public:
    int minSteps(string s, string t) {
        int hashs[256];
        int hasht[256];
        int ans =0;
        memset(hashs,0,sizeof(hashs));
        memset(hasht,0,sizeof(hasht));
        for(int i =0;i<s.size();++i){
            ++hashs[s[i]];
            ++hasht[t[i]];
        }
        for(int i ='a';i<='z';++i){
            if(hasht[i]-hashs[i]>0){
                ans+=hasht[i]-hashs[i];
            }
        }
        return ans;
    }
};

四、面试题 10.02. 变位词组

1.原题链接

面试题 10.02. 变位词组

2.题目描述

        编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。

3.解题思路

        遍历strs的每个字符,按照字典序排序,之后插入到哈希表中,之后遍历哈希表,将原数组变为二维数组。

4.源码

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string,vector<string>> hash;
        for(int i=0;i<strs.size();++i){
            string s =strs[i];
            sort(s.begin(),s.end());
            hash[s].push_back(strs[i]);
        }
        vector<vector<string>> ans;
        for(auto i :hash){
            ans.push_back(i.second);
        }
        return ans;
    }
};

ps:本题与49. 字母异位词分组 相同,做一题过两题。

总结

        第七天辣,还需加油。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枏念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值