LeetCode hot100---哈希表专题(C++语言)

常用的哈希数据结构

(1)unordered_set

bash 复制代码
只关心value,不关心key,set中的数据会自动升序

(2)unordered_map

bash 复制代码
既关心value,又关心key,map中的数据会自动升序

1、两数之和

(1)题目描述以及输入输出

bash 复制代码
(1)题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
(2)输入输出描述:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]

关键思路:
将数组元素依次添加进unordered_map,每次查找target-nums[i],存在就将下标返回结果

(2)代码块

bash 复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        vector<int> result;
        unordered_map<int,int> record;
        for(int i = 0;i<nums.size();i++)
        {
            if(record.find(target-nums[i]) != record.end())	
            {
                result.push_back(i);
                result.push_back(record.find(target-nums[i])->second);
            }
            record[nums[i]] = i;

        }    
        return result;
    }
};

2、字母异位词分组

(1)题目描述以及输入输出

bash 复制代码
(1)题目描述:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
(2)输入输出描述:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

关键思路:
创建unordered_map数据结构,排序后的strs[i]作为key,排序前的strs[i]作为value
auto it 遍历map,依次将map->second插入结果数组

(2)代码块

bash 复制代码
class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) 
    {
        unordered_map<string,vector<string>> record;
        string key;
        for(int i = 0;i<strs.size();i++)		// 将strs[i]添加进哈希表
        {
            key = strs[i];
            sort(key.begin(),key.end());
            record[key].push_back(strs[i]);
        }
        vector<vector<string>> result;
        for(auto it = record.begin();it != record.end();it++)
        {
            result.push_back(it->second);		// 将map->second添加进结果数组
        }
        return result;
    }
};

3、最长连续序列

(1)题目描述以及输入输出

bash 复制代码
(1)题目描述:
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度
(2)输入输出描述:
输入:nums = [100,4,200,1,3,2]
输出:4

关键思路:
将nums映射进set,自动完成排序
使用.count()找到连续序列第一个值,从当前向后遍历记录连续序列长度

(2)代码块

bash 复制代码
class Solution {
public:
    int longestConsecutive(vector<int>& nums) 
    {
        int result = 0;
        unordered_set<int> record(nums.begin(),nums.end());	// 数组映射进set完成排序
        for(int num:record)
        {
            if(!record.count(num-1))						// 查找连续序列第一个值
            {
                int tmp = num;								// 记录第一个值
                while(record.count(tmp))
                {
                    tmp++;
                }											// 直到最后一个值		
                result = max(result,tmp-num);				// 记录序列长度
            }
        }
        return result;
    }
};
相关推荐
我变成萤火虫21 小时前
河南萌新联赛2026第(四)场:南阳理工学院
数据结构·c++·算法·贪心算法·stl·动态规划
To_OC1 天前
LC 239 滑动窗口最大值:从暴力超时到单调队列一遍过
javascript·算法·leetcode
.道阻且长.1 天前
9.LeetCode算法习题讲解--滑动窗口--无重复字符的最长字串
算法·leetcode·职场和发展·哈希算法
余额瞒着我当琳1 天前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
ShineWinsu1 天前
对于C++:布隆过滤器(bloomfilter)的详细解析
c++·面试·位图·位运算·布隆过滤器·海量数据·比特位
Nil2081 天前
leetcode 138随机链表的复制
算法·leetcode·链表
牛油果子哥q1 天前
C++内存模型与深浅拷贝万字详解:栈堆静态内存布局、深浅拷贝底层差异、内存泄漏根治、拷贝崩溃踩坑、手写深拷贝实战
java·开发语言·c++
大鹏的NLP博客1 天前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译
Nil2081 天前
leetcode 24两两交换链表中的节点
算法·leetcode·链表