力扣C++算法:哈希表(存在重复元素|存在重复元素II|字母异位词分组)

上篇文章:C++算法:哈希表(简介|两数之和|判断是否互为字符重排)

目录

1.存在重复元素

算法原理

2.存在重复元素II

算法原理

3.字母异位词分组

算法原理


1.存在重复元素

https://leetcode.cn/problems/contains-duplicate/

算法原理

和之前做的两数之和很相似,在本题中固定一个值,再将其放入哈希表中进行查值即可,也不需要运用下标。

cpp 复制代码
class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> hash;
        for(auto x : nums)
        {
            if(hash.count(x)) return true;
            else hash.insert(x);
        }
        return false;
    }
};

2.存在重复元素II

https://leetcode.cn/problems/contains-duplicate-ii/description/

算法原理

与上一题的区别就是,不仅要找相同数,还要判断其下标是否<=k

细节问题:当碰到相同值,并且将其放入哈希表时后面放入的值会覆盖掉之前的值,那么正确做法是什么?

观察题目要求,abs(i - j) <= k,也就是说只有下标距离很近时才能满足条件,而当前值不满足条件,那么其之后的相同数肯定也不会满足条件,因此大胆的将前数覆盖掉就好。

cpp 复制代码
class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        unordered_map<int, int> hash;
        for(int i = 0; i < nums.size(); i++)
        {
            if(hash.count(nums[i]))
            {
                if(i - hash[nums[i]] <= k) return true;
            }
            hash[nums[i]] = i;
        }
        return false;
    }
};

3.字母异位词分组

https://leetcode.cn/problems/group-anagrams/

算法原理

使用哈希表,先判断两个字符串是否是字母异位词,在之前做题中,我们使用的是hash表对其进行判断(遇到相同的字符,次数减一)。在本题中,我们可以通过排序,对其ASCII码值进行判断,也能完成排序任务。

接下来,我们需要对不同的异位词进行分组,此处,我们使用string和string数组对其进行分组,当我们遍历完第一个字符串时,先对其进行排序(排序会将其排为相同的字符串),其后进行判断,若原字符串中有,则将其接入后面,若没有,则重新创建一个数组。

cpp 复制代码
class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string, vector<string>> hash;
        // 分组
        for(auto& s : strs)
        {
            string tmp = s;
            sort(tmp.begin(), tmp.end());
            hash[tmp].push_back(s);
        }

        // 提取结果
        vector<vector<string>> ret;
        for(auto& [x, y] : hash)
        {
            ret.push_back(y);
        }
        return ret;
    }
};

代码中,我们只需要提取y即可,以示例一为例,其分组后的结果是:

  • "aet" : ["eat","tea","ate"]
  • "ant" : ["tan","nat"]
  • "abt" : ["bat"]

而x存储first,y存储second,因此返回y即可。

本章完。

相关推荐
穿条秋裤到处跑2 小时前
每日一道leetcode(2026.04.17):镜像对之间最小绝对距离
算法·leetcode
codebrick2 小时前
408 数据结构:快排 / 堆排 / 归并 / 希尔 等排序算法对比(复杂度、稳定性、真题考点
数据结构·考研·算法·排序算法·408
脱氧核糖核酸__2 小时前
LeetCode热题100——240.搜索二维矩阵 II(题目+题解+答案)
c++·算法·leetcode·矩阵
纤纡.2 小时前
基于 TextRNN 的微博情绪分类系统实现与解析
人工智能·算法·分类·数据挖掘
hehelm2 小时前
string的模拟实现
数据结构·算法
白羊by2 小时前
逻辑回归与Softmax的区别
算法·机器学习·逻辑回归
Tisfy2 小时前
LeetCode 3761.镜像对之间最小绝对距离:哈希表(维护左,枚举右)
算法·leetcode·散列表·题解
小鱼~~2 小时前
逻辑回归简介
算法·机器学习·逻辑回归
黎阳之光2 小时前
黎阳之光受邀出席上海口岸联合会2026智慧口岸研讨班 无感通关方案获盛赞
大数据·人工智能·算法·安全·数字孪生