【Hot100-Java简单】:两数之和 (Two Sum) —— 从暴力枚举到哈希表的思维跃迁

1. 题目回顾

题目描述:

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

约束条件

  • 每种输入只会对应一个答案。

  • 数组中同一个元素在答案里不能重复出现。

  • 可以按任意顺序返回答案。

示例

复制代码
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

2. 方法一:暴力枚举 (Brute Force)

这是最直观的解题思路。这就好比我们在一个房间里找两个人,我们先拉住第1个人,然后去问剩下的所有人:"你是那个能和我配对的人吗?"如果不是,再拉住第2个人,重复这个过程。

思路与算法

  1. 枚举数组中的每一个数 x(作为第一个加数)。

  2. x 后面的元素中,寻找是否存在 target - x(作为第二个加数)。

  3. 一旦找到,立即返回两个数的下标。

代码实现

Java

复制代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int n = nums.length;
        // 第一层循环:选定第一个数
        for (int i = 0; i < n; ++i) {
            // 第二层循环:在 i 之后寻找第二个数
            for (int j = i + 1; j < n; ++j) {
                if (nums[i] + nums[j] == target) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }
}

复杂度分析

  • 时间复杂度:

    其中 是数组元素的数量。最坏情况下,我们需要遍历几乎所有的元素对。当数据量较大(例如 )时,计算量会达到 1亿次级别,效率较低。

  • 空间复杂度:

    除了存储变量,不需要额外的内存空间。


3. 方法二:哈希表 (Hash Map) ------ 性能的飞跃

暴力法慢在哪里?慢在"寻找"。

我们在数组中寻找 target - x 时,不得不遍历整个后续数组,这需要 O(N) 的时间。如果我们能把"寻找"的时间缩短到 呢?

这就需要用到哈希表 (Hash Map)

思路与算法

我们可以把哈希表想象成一个"备忘录"。

在遍历数组时,对于每一个数 numsi

  1. 我们先算一下:为了凑齐 target,我需要哪个数?(即 need = target - nums[i])。

  2. 查备忘录 :看看之前遍历过的数字里,有没有这个 need

    • 如果就在备忘录里 :太好了,说明之前遇到过那个数,直接把它的下标拿出来,和当前的 i 一起返回。

    • 如果不在 :把当前的数 nums[i] 和它的下标 i 记入备忘录,方便后面的数字来找我匹配。

代码实现

Java

复制代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        // Key存数值,Value存下标
        HashMap<Integer, Integer> map = new HashMap<>();
        
        for(int i = 0; i < nums.length; i++){
            int need = target - nums[i];
            
            // 查备忘录:看需要的那个数是否存在
            if(map.containsKey(need)){
                // 找到了!直接返回 [需要的数的下标, 当前数的下标]
                return new int[]{map.get(need), i};
            }
            
            // 没找到,把自己登记到备忘录
            map.put(nums[i], i);
        }
        return new int[0];
    }
}

复杂度分析

  • 时间复杂度:

    我们只需要遍历一次数组。在哈希表中查找元素的时间复杂度平均为 O(1)

  • 空间复杂度:

    我们需要一个哈希表来存储已经遍历过的元素,最坏情况下需要存储 N 个元素。


4. 总结与对比

特性 暴力枚举法 哈希表法
核心思想 穷举所有组合 边查边存(以空间换时间)
时间复杂度 (慢) (快)
空间复杂度 (省内存) (耗内存)
适用场景 数据量极小,内存极其受限 通用场景,追求运行速度
相关推荐
xbgRS11 小时前
springboot的自动装配
java·spring boot
祖力5516 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
大明者省18 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
嘻哈∠※18 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_79819 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25819 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅20 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
Shell运维手记20 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI20 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型21 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法