news 2026/5/3 17:07:46

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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)

思路与算法

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

在遍历数组时,对于每一个数 nums[i]:

  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. 总结与对比

特性暴力枚举法哈希表法
核心思想穷举所有组合边查边存(以空间换时间)
时间复杂度(慢)(快)
空间复杂度(省内存)(耗内存)
适用场景数据量极小,内存极其受限通用场景,追求运行速度
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:02:31

PyTorch-CUDA-v2.6镜像中运行LangChain构建对话代理

PyTorch-CUDA-v2.6 镜像中运行 LangChain 构建对话代理 在当今 AI 应用快速迭代的背景下&#xff0c;一个常见的痛点浮出水面&#xff1a;开发者往往花了大量时间在环境配置上——CUDA 版本不兼容、PyTorch 编译失败、依赖冲突频发……而真正用于模型开发和功能实现的时间却被严…

作者头像 李华
网站建设 2026/5/1 18:14:11

CH340转USB-Serial Controller D常见识别问题解析

深入理解CH340&#xff1a;为何你的“USB-SERIAL CONTROLLER D”总是连不上&#xff1f; 在调试STM32、ESP8266这类开发板时&#xff0c;你是否曾无数次面对这样一个问题——插上USB转串口模块后&#xff0c;设备管理器里赫然显示着 “USB-SERIAL CONTROLLER D” &#xff0…

作者头像 李华
网站建设 2026/4/23 14:11:23

自动驾驶车辆调度算法研究:项目应用深度解析

自动驾驶车辆调度算法研究&#xff1a;项目应用深度解析当城市开始“呼吸”——智能交通的隐形大脑如何运作&#xff1f;你有没有想过&#xff0c;当一辆自动驾驶小巴缓缓驶向你家门口接你下班时&#xff0c;背后有多少场“看不见的博弈”正在发生&#xff1f;它为什么偏偏是这…

作者头像 李华
网站建设 2026/5/1 8:34:01

JavaScript 代码性能优化的基本原则

在现代 Web 开发中&#xff0c;JavaScript 代码的性能优化至关重要。随着 Web 应用的复杂度不断增加&#xff0c;用户对于页面响应速度和流畅度的要求也越来越高。优化 JavaScript 代码不仅可以提升用户体验&#xff0c;还能降低服务器负载&#xff0c;提高应用的整体性能。本文…

作者头像 李华
网站建设 2026/5/3 13:10:11

代码压缩与混淆:减小文件体积

在前端项目中&#xff0c;文件体积的大小对页面的加载速度和性能有着至关重要的影响。代码压缩与混淆是减小文件体积的重要手段&#xff0c;能够有效提升网站性能和用户体验。本文将深入探讨代码压缩与混淆的相关知识&#xff0c;包括原理、工具使用和实际操作等内容。 代码压缩…

作者头像 李华
网站建设 2026/5/1 10:00:20

PyTorch-CUDA-v2.6镜像与Host主机文件共享配置技巧

PyTorch-CUDA-v2.6镜像与Host主机文件共享配置技巧 在现代深度学习开发中&#xff0c;一个常见的痛点是&#xff1a;明明代码写得没问题&#xff0c;却因为环境版本不一致、GPU调用失败或数据路径混乱导致训练跑不起来。尤其当团队协作时&#xff0c;“在我机器上能运行”成了…

作者头像 李华