news 2026/7/1 8:47:03

LeetCode 1:两数之和(Two Sum)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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. 使用范围
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 8:39:44

Java 核心语法完整总结博客

一、前言Java 作为面向对象、跨平台的静态强类型编程语言&#xff0c;所有程序运行都基于一套固定核心语法。本文从基础数据类型、流程控制、面向对象、数组集合、异常、常用关键字六大模块梳理 Java 核心语法&#xff0c;覆盖入门到开发必备基础&#xff0c;适合新手系统复习、…

作者头像 李华
网站建设 2026/7/1 8:36:45

3步极速下载:百度网盘直链解析工具让你的下载速度飙升5倍!

3步极速下载&#xff1a;百度网盘直链解析工具让你的下载速度飙升5倍&#xff01; 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的龟速下载而烦恼吗&#xff…

作者头像 李华
网站建设 2026/7/1 8:36:40

分布式事务实践

分布式事务实践&#xff1a;构建可靠系统的关键挑战 在当今的微服务与云原生架构中&#xff0c;分布式事务是确保数据一致性的核心技术&#xff0c;但也是开发者面临的最大挑战之一。随着业务复杂度的提升&#xff0c;跨服务、跨数据库的事务处理需求日益增多&#xff0c;传统…

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

CRMEB Pro 订单源码解析:购物车结算、优惠分摊、库存预占到底怎么串?

## 摘要很多人做订单二开&#xff0c;第一反应是“把总价算出来就行了”。但 CRMEB Pro 的真实链路里&#xff0c;下单前要先把购物车里的商品整合成可结算数据&#xff0c;再根据用户等级、付费会员、渠道身份、活动商品、首单优惠、优惠券、积分、运费模板重新算一遍&#xf…

作者头像 李华
网站建设 2026/7/1 8:31:12

sql语法 - WITH, ROW_NUMBER, 经典用法

全局编号&#xff08;不分组&#xff09; ROW_NUMBER() 是 SQL 中一个非常重要的窗口函数&#xff08;Window Function&#xff09;&#xff0c;用于为查询结果集中的每一行生成唯一的、连续的整数序号&#xff08;从 1 开始&#xff09;。 ROW_NUMBER() OVER ([PARTITION BY 分…

作者头像 李华
网站建设 2026/7/1 8:31:03

如何轻松重置JetBrains IDE试用期:专业开发者的完整解决方案

如何轻松重置JetBrains IDE试用期&#xff1a;专业开发者的完整解决方案 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter JetBrains IDE试用期重置工具&#xff08;ide-eval-resetter&#xff09;是一款专门为开发…

作者头像 李华