【算法专题】哈希表:从“两数之和”到“最长连续序列”的深度解析

【算法专题】哈希表:从"两数之和"到"最长连续序列"的深度解析


我的主页: 寻星探路
个人专栏: 《JAVA(SE)----如此简单!!! 》 《从青铜到王者,就差这讲数据结构!!!》
《数据库那些事!!!》 《JavaEE 初阶启程记:跟我走不踩坑》
《JavaEE 进阶:从架构到落地实战 》 《测试开发漫谈》
《测开视角・力扣算法通关》 《从 0 到 1 刷力扣:算法 + 代码双提升》
《Python 全栈测试开发之路》
没有人天生就会编程,但我生来倔强!!!

寻星探路的个人简介:


  在 LeetCode 刷题过程中,哈希表(Hash Table) 是出现频率最高、应用最广的数据结构之一。它的核心价值在于:**将原本需要 甚至 的查找时间复杂度降低到 **。

  本文将通过三道经典题目,带你由浅入深掌握哈希表的应用精髓。


一、 两数之和 (Two Sum)

1. 题目描述

  给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

2. 解题思路:空间换时间

  最朴素的方法是暴力双循环,时间复杂度为 。

  利用哈希表,我们可以在遍历数组的同时,记录下每一个数字及其下标。对于当前的数字 nums[i],我们只需要去哈希表中查找是否存在 target - nums[i]

3. 代码实现 (Java)

java 复制代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        // Key: 数值, Value: 下标
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            // 先检查补数是否存在
            if (map.containsKey(target - nums[i])) {
                return new int[]{map.get(target - nums[i]), i};
            }
            // 再将当前元素存入 map
            map.put(nums[i], i);
        }
        return new int[0];
    }
}

二、 字母异位词分组 (Group Anagrams)

1. 题目描述

  给你一个字符串数组,请你将 字母异位词 组合在一起。字母异位词是由重新排列源单词的字母得到的一个新单词(例如 "eat" 和 "tea")。

2. 解题思路:寻找"公共特征"作为 Key

  字母异位词的特点是:虽然字母顺序不同,但排序后的字符串是完全相同的

  因此,我们可以将"排序后的字符串"作为哈希表的 Key,将"原始字符串列表"作为 Value

3. 代码实现 (Java)

java 复制代码
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for (String str : strs) {
            // 将字符串转为字符数组并排序
            char[] array = str.toCharArray();
            Arrays.sort(array);
            String key = new String(array);
            
            // 获取对应的分组列表,若不存在则创建
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<List<String>>(map.values());
    }
}

三、 最长连续序列 (Longest Consecutive Sequence)

1. 题目描述

  给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。要求时间复杂度为 。

2. 解题思路:去重与逻辑跳过

由于要求 ,我们不能进行全局排序。

  1. 使用 HashSet 存储所有数字,实现 查询。
  2. 遍历集合中的每个数 num
  3. 关键点 :如果 num - 1 存在于集合中,说明 num 不是连续序列的起点,直接跳过。只有当 num 是起点时(即 num - 1 不存在),才开始循环匹配 num + 1, num + 2...

3. 代码实现 (Java)

java 复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> num_set = new HashSet<Integer>();
        for (int num : nums) {
            num_set.add(num);
        }

        int longestStreak = 0;
        for (int num : num_set) {
            // 只有当 num 是序列起点时才开始计算
            if (!num_set.contains(num - 1)) {
                int currentNum = num;
                int currentStreak = 1;

                while (num_set.contains(currentNum + 1)) {
                    currentNum += 1;
                    currentStreak += 1;
                }
                longestStreak = Math.max(longestStreak, currentStreak);
            }
        }
        return longestStreak;
    }
}

💡 总结:哈希表类题目的思考通用公式

面对哈希表题目,可以按照以下三个步骤进行思考:

1. 明确"我们要找什么?"

  • 查找是否存在? ------ 使用 HashSet
  • 查找对应的关联信息(下标、次数、分组)? ------ 使用 HashMap

2. 寻找"不变的 Key"

这是哈希表题目的灵魂。你需要找到一个特征,让所有符合条件的元素都能映射到同一个 Key 上:

  • 两数之和 :Key 是数字本身,通过 target - x 寻找关联。
  • 字母异位词:Key 是排序后的字符串(或字符计数的数组)。
  • 分组/去重:Key 是能够代表该类别唯一特征的值。

3. 优化"遍历的冗余"

  在"最长连续序列"中,我们通过 !num_set.contains(num - 1) 过滤掉了大量的重复计算。在处理哈希表时,思考**"我是否在重复处理同一个序列?""我能否在一次遍历中同时完成存入和查找?"**(如两数之和),是提升算法效率的关键。


感谢阅读!如果觉得有帮助,欢迎点赞、收藏、关注!

相关推荐
Georgeviewer10 小时前
商业落地评测|实体门店GEO优化性价比与服务体系深度复盘
大数据·人工智能
GuWenyue11 小时前
分不清AI Workflow与Agent?3个实战案例彻底讲透,做AI应用不再踩选型坑
人工智能
彩讯股份30063412 小时前
彩讯股份与心洲科技签署战略合作协议,共建企业级模型后训练能力
人工智能·科技
To_OC12 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
Scott9999HH12 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
迅易科技12 小时前
从场景验证到Agent上线:迅易 × WorkBuddy如何帮助企业建设AI能力?
人工智能·ai·腾讯云
腻害兔12 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
PNP Robotics12 小时前
多伦多大学机器人峰会|物理AI与具身智能落地新趋势
人工智能·深度学习·机器学习·机器人
GIR12312 小时前
官方出品 | 多通道土壤呼吸测量系统市场现状与十五五规划深度报告:行业分析+趋势预测全收录
大数据·人工智能·机器学习