栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

五月集训-07【哈希表】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

五月集训-07【哈希表】

文章目录
  • 前言
  • 一、练习题目
  • 二、思路及题解
    • 1. LC1512-好数对的数目
    • 2. LC2006-差的绝对值为 K 的数对数目
    • 3. LC1347-制造字母异位词的最小步骤数
    • 4. 面试题 10.02. 变位词组
  • 总结


前言

        欢迎大家积极在评论区留言一起讨论交流,知无不言,言无不尽,共同进步。本文是 哈希表 专题,更多其他专题内容详见《LeetCode每月集训系列》


一、练习题目
题目链接难度备注
[1512. 好数对的数目](https://leetcode.cn/problems/number-of-good-pairs/★☆☆☆☆
2006. 差的绝对值为 K 的数对数目★☆☆☆☆
1347. 制造字母异位词的最小步骤数★★☆☆☆
面试题 10.02. 变位词组★★☆☆☆
二、思路及题解 1. LC1512-好数对的数目

方法一:暴力循环

(1)双重循环遍历即可求解。

代码如下:

class Solution {
public:
    int numIdenticalPairs(vector& nums) {
        int ans = 0;
        for (int i = 0; i < nums.size(); ++i) {
            for (int j = i + 1; j < nums.size(); ++j) {
                if (nums[i] == nums[j]) {
                    ++ans;
                }
            }
        }
        return ans;
    }
};

方法二:

(1)创建一个哈希表,遍历数组统计数组中数字重复出现的次数n;
(2)当遍历时必然是i < j的,则可以组成好数对的组合有1 + 2 + ··· + (n - 1)对。

代码如下:

class Solution {
public:
    int numIdenticalPairs(vector& nums) {
        unordered_map  cnt;
        int ans = 0;
        for (int num: nums) {
            ans += cnt[num]++;
        }
        return ans;
    }
};
2. LC2006-差的绝对值为 K 的数对数目

方法一:哈希表

(1)对于每一个j而言,只需要再找到满足条件的i即可;
(2)满足 ∣nums[i] − nums[j]∣ = k 的i的个数,也就相当于满足 nums[i] = nums[j] + k 或 nums[i] = nums[j] − k 的 i 的个数。

代码如下:

class Solution {
public:
    int countKDifference(vector& nums, int k) {
        unordered_map cnt;
        int ans = 0;
        for (auto j : nums) {
            ans += cnt[j - k] + cnt[j + k];
            cnt[j]++;
        }
        return ans;
    }
};

方法二:

(1)创建一个哈希表统计数组中每个数字出现的次数;
(2)依次将相隔为k的两个值相乘,即可统计出符合要求的数对个数。

代码如下:

class Solution {
public:
    int countKDifference(vector& nums, int k) {
        int hash[101];
        memset(hash, 0, sizeof(hash));
        int ans = 0;
        for (int i = 0; i < nums.size(); ++i) {
            ++hash[nums[i]];
        }
        for (int num = 1; num + k < 101; ++num) {
            ans += hash[num] * hash[num + k];  // 数组中的都数字大于0
        }
        return ans;
    }
};
3. LC1347-制造字母异位词的最小步骤数

方法一:

(1)创建两个哈希表,分别对字符串中字符的个数进行计数;
(2)遍历目标字符串s,若s-t大于0,其差值即为要替换字符的个数。

代码如下:

class Solution {
public:
    int minSteps(string s, string t) {
        unordered_map smap, tmap;
        int ans = 0;
        for (int i = 0; i < s.size(); ++i) {
            ++smap[s[i]];
            ++tmap[t[i]];
        }
        for (auto& [ch, _] : smap) {
            int n = smap[ch] - tmap[ch];
            if (n > 0) {
                ans += n; 
            }
        }
        return ans;
    }
};
4. 面试题 10.02. 变位词组

方法一:哈希表+排序

(1)遍历字符串数组,并对每个字符串排序使得不同的变位词达成统一,从而定义一个字符串到字符串的哈希映射;
(2)然后遍历哈希表,将同一类型变位词放在一起输出即可。

代码如下:

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

总结

        题目难不要怕,只要每个月的每一天都坚持刷题学习,总有一天会熟练掌握的。欢迎加入【知识星球|英雄算法联盟】与我们一同早起刷刷刷⛽️

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920613.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号