当前位置: 首页 > news >正文

LeetCode 1:两数之和(Two Sum)

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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

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

示例

示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 示例 2: 输入:nums = [3,2,4], target = 6 输出:[1,2] 示例 3: 输入:nums = [3,3], target = 6 输出:[0,1]

约束条件

  • 2 <= nums.length <= 10⁴
  • -10⁹ <= nums[i] <= 10⁹
  • -10⁹ <= target <= 10⁹
  • 只会存在一个有效答案

二、题目解析

核心问题拆解

关键点分析
输入整数数组 + 目标值
输出两个数的下标(不是数值本身)
约束同一元素不能使用两次
保证有且仅有一个解

思考方向

原问题

nums[i] + nums[j] = target

转化思维

对于每个 nums[i]
寻找 target - nums[i]

如何快速查找?

哈希表 O(1)


三、算法解答


算法一:暴力枚举法

1. 算法原理描述

核心思想:穷举所有可能的两数组合,检查它们的和是否等于目标值。

实现方式

  • 使用两层循环
  • 外层循环固定第一个数nums[i]
  • 内层循环遍历其后的所有数nums[j](j > i)
  • 检查nums[i] + nums[j] == target
2. 算法解答过程

nums = [2, 7, 11, 15],target = 9为例:

外层 i内层 jnums[i]nums[j]是否等于 target
01279✅ 找到!

返回[0, 1]

3. 算法原理图像解析

复杂度分析

⏱ 时间: O(n²)

💾 空间: O(1)

暴力枚举流程

✅ 是

❌ 否

开始

外层循环 i = 0

内层循环 j = 1

nums[0] + nums[1]
= 2 + 7 = 9
== target?

返回 [0, 1]

j++, 继续内层

若内层结束
i++, 继续外层

数组 nums, target = 9

[0]=2

[1]=7

[2]=11

[3]=15

4. 算法代码

class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int n = nums.size(); // 外层循环:固定第一个数 for (int i = 0; i < n - 1; i++) { // 内层循环:遍历第一个数之后的所有数 for (int j = i + 1; j < n; j++) { // 检查两数之和是否等于目标值 if (nums[i] + nums[j] == target) { return {i, j}; } } } // 题目保证有解,这里不会执行到 return {}; } };

5. 复杂度分析
复杂度类型说明
时间复杂度O(n²)两层嵌套循环,最坏情况遍历 n(n-1)/2 次
空间复杂度O(1)只使用常数额外空间
6. 使用范围
场景适用性
数据规模小(n < 1000)✅ 适用
数据规模大❌ 会超时
对空间要求极高✅ 适用
面试中作为初始解法✅ 适用,但需优化

算法二:哈希表法(一遍哈希)⭐ 最优解

1. 算法原理描述

核心思想:将「寻找两数之和」转化为「寻找差值」问题。

关键转换

nums[i] + nums[j] = target ↓ 转化 nums[j] = target - nums[i]

实现方式

  • 使用哈希表存储已遍历过的元素及其下标
  • 对于当前元素nums[i],计算complement = target - nums[i]
  • 在哈希表中查找complement是否存在
  • 若存在,说明找到答案;若不存在,将当前元素加入哈希表

优势:哈希表的查找时间复杂度为 O(1),整体只需一次遍历。

2. 算法解答过程

nums = [2, 7, 11, 15],target = 9为例:

步骤当前元素complement哈希表查找操作哈希表状态
1nums[0]=29-2=77 不存在存入
2nums[1]=79-7=22 存在!下标0返回 [0,1]-
3. 算法原理图像解析

🔑 核心要点

边遍历边建表

先查找再存入

O(1) 查找

步骤2: 处理 nums[1] = 7

计算 complement = 9 - 7 = 2

哈希表中
查找 2

✅ 找到! 下标=0

返回 [0, 1]

步骤1: 处理 nums[0] = 2

计算 complement = 9 - 2 = 7

哈希表中
查找 7

❌ 未找到

存入哈希表
{2: 0}

输入: nums = [2,7,11,15], target = 9

2

7

11

15

哈希表状态变化:

存入 2:0

查找2

处理7时

2 → 0

查找2 ✅

处理2后

2 → 0

初始状态

空 ∅

4. 算法代码

class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { // 哈希表:key = 数值,value = 下标 unordered_map<int, int> hashMap; for (int i = 0; i < nums.size(); i++) { // 计算当前元素的"配对值" int complement = target - nums[i]; // 在哈希表中查找配对值 if (hashMap.find(complement) != hashMap.end()) { // 找到了!返回两个下标 return {hashMap[complement], i}; } // 未找到,将当前元素存入哈希表 hashMap[nums[i]] = i; } // 题目保证有解,这里不会执行到 return {}; } };

5. 代码详解

// 关键点解析: // 1. 为什么用 unordered_map 而不是 map? // - unordered_map 基于哈希表,查找/插入 O(1) // - map 基于红黑树,查找/插入 O(log n) // 2. 为什么先查找再存入? // - 避免同一元素被使用两次 // - 例如:nums = [3, 3], target = 6 // - 第一个3存入后,第二个3能找到第一个3 // 3. hashMap.find() vs hashMap.count() // - find() 返回迭代器,未找到返回 end() // - count() 返回 0 或 1 // - 两种写法都可以,find() 更常用

6. 复杂度分析
复杂度类型说明
时间复杂度O(n)只需遍历数组一次,哈希表操作 O(1)
空间复杂度O(n)最坏情况需存储 n-1 个元素
7. 使用范围
http://www.gsyq.cn/news/1613347.html

相关文章:

  • 为什么Top 1%的AI增强型工程师年薪突破$320K?——解密其私有提示工程知识图谱与验证框架
  • 智慧校园平台怎么选?老师校长们都该知道的几个关键点
  • 分布式事务实践
  • 实战分享:用ShardingSphere 4.1.1搞定国际化多语言数据源切换(附完整代码)
  • 【VMware迁移终极指南】:20年专家亲授3种零失误跨机迁移法,99%的人不知道第2种
  • 计算机毕业设计之基于决策树的农业产值预测系统设计与实现
  • 别再死记硬背了!用‘人名与房产’的比喻,5分钟搞懂UDS 2F服务的ControlMask
  • Flutter MVVM实战:用Riverpod 2.0重构你的待办事项App(附完整源码)
  • 婚纱摄影管理系统源码 Java+SpringBoot+Vue 前后分离
  • 别再盲目revert!VMware快照恢复前必须执行的6项预检清单(含自动校验脚本下载)
  • 5个步骤快速上手XUnity.AutoTranslator:Unity游戏自动翻译终极指南
  • FlaUInspect:解决UI自动化测试元素定位难题的现代化技术方案
  • 2026年西安旅游选小包团,到底哪家旅行社才是你的最佳之选?
  • 【企业级OVF交付标准】:从单机导出到跨云迁移,一套标准化流程覆盖ESXi 6.7–8.0全版本
  • 从手机到车机:Android程序员转型车载开发,需要补哪些课?(附8155芯片实战)
  • 腾讯云服务器镜像到底怎么选?一篇给小白看的 CVM 镜像入门到实战指南
  • 国产大模型进入教育终端:我用魔珐星云让 AI 教育 Agent 具象交互
  • 从线性层到自注意力:手把手拆解torch.matmul()在Transformer模型中的5个核心应用
  • YOLOv8从零实战:环境搭建、自定义数据集训练与部署全流程详解
  • 从游戏到科学可视化:用C#和OpenTK 4.x打造你的第一个3D旋转立方体(附完整源码)
  • fullPage.js深度解析:现代全屏滚动架构设计与性能优化实现
  • AI辅助修复Blender到Unity插件:自动化资产导入流程实践
  • 开店收银系统全面评估与推荐:市场主流产品分析
  • 如何高效使用百度网盘直链解析工具:快速获取下载地址的实用指南
  • 浮点运算在MCU上的坑,新手十个踩九个
  • JD-GUI 反编译软件
  • Dism++:Windows系统维护的完整解决方案与高效优化指南
  • Mac剪贴板只能存一条?Paste v6.5.2 帮你管理历史记录
  • Windows风扇控制神器:FanControl中文版完全指南
  • 5分钟零基础入门:ServerPackCreator轻松创建Minecraft服务器包终极指南