news 2026/4/23 12:12:51

两数之和(哈希表解法,时间复杂度 O (n))

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
两数之和(哈希表解法,时间复杂度 O (n))

大家好,今天分享 LeetCode 第一题 “两数之和” 的最优解法,用哈希表把时间复杂度从暴力法的 O (n²) 降到 O (n)~

题目描述

给定整数数组nums和目标值target,找出数组中和为 target 的两个整数,返回它们的下标。

  • 假设每种输入对应唯一答案
  • 不能使用同一个元素两次

暴力法的问题

最直观的思路是 “双重循环遍历所有组合”:

for (int i=0; i<nums.size(); i++) { for (int j=i+1; j<nums.size(); j++) { if (nums[i]+nums[j] == target) return {i,j}; } }

但双重循环的时间复杂度是O(n²),当数组很大时效率很低。

哈希表优化思路

核心是用空间换时间:用哈希表存储 “元素值 → 下标” 的映射,遍历数组时直接查 “目标差值” 是否已在表中。

步骤:

  1. 定义哈希表unordered_map<int, int>,key 存元素值,value 存对应下标;
  2. 遍历数组的每个元素nums[i]
    • 计算目标差值complement = target - nums[i]
    • complement在哈希表中 → 直接返回{哈希表中complement的下标, i}
    • 若不在 → 把当前元素nums[i]和下标i存入哈希表;
  3. 题目保证有解,无需额外处理边界。

完整代码(C++)

#include <vector> #include <unordered_map> using namespace std; 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 {}; } };

代码解释

  • 哈希表的作用:把 “查找差值” 的操作从暴力法的 O (n) 降到 O (1);
  • 遍历顺序:边遍历边存哈希表,保证不会重复使用同一个元素(因为查的是 “之前遍历过的元素”);
  • 时间 / 空间复杂度
    • 时间:O (n)(仅遍历一次数组);
    • 空间:O (n)(哈希表最多存 n 个元素)。

测试用例验证

以示例 2nums = [3,2,4], target = 6为例:

  1. i=0,nums [0]=3 → complement=3,哈希表为空 → 存 {3:0};
  2. i=1,nums [1]=2 → complement=4,哈希表无 4 → 存 {2:1};
  3. i=2,nums [2]=4 → complement=2,哈希表中存在 2(下标 1)→ 返回 {1,2}。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:44:04

【高性能系统必修课】:彻底搞懂内存碎片及其规避手段

第一章&#xff1a;内存碎片的本质与影响 内存碎片是操作系统或运行时环境中常见的性能瓶颈之一&#xff0c;它指的是可用内存被分割成多个不连续的小块&#xff0c;导致即使总空闲内存充足&#xff0c;也无法满足较大内存分配请求的现象。内存碎片主要分为两种类型&#xff1a…

作者头像 李华
网站建设 2026/4/16 22:45:49

商汤行业首发创编一体、多剧集生成智能体Seko 2.0

12月15日&#xff0c;Seko2.0重磅发布。作为行业首个创编一体、多剧集生成智能体&#xff0c;Seko2.0专为当下炙手可热的短剧、漫剧行业的个人创作者与工作室量身打造&#xff0c;让“一人剧组”变成可能。据「TMT星球」了解&#xff0c;自2025年7月上线以来&#xff0c;Seko仅…

作者头像 李华
网站建设 2026/4/14 5:36:05

n8n 2.0 中文汉化版一键部署教程 | 解除Execute Command限制

&#x1f680; n8n 2.0 中文汉化版一键部署教程 | 解除Execute Command限制&#xff0c;让自动化更自由&#xff01; &#x1f4d6; 前言 你是否在使用 n8n 时遇到过这些问题&#xff1a; ❌ 界面全是英文&#xff0c;看不懂&#xff1f;❌ Execute Command 节点被禁用&#xf…

作者头像 李华
网站建设 2026/4/20 18:33:38

你不知道的Rust-PHP底层通信细节:如何安全传递复杂数据结构?

第一章&#xff1a;Rust-PHP 扩展的内存交互机制在构建高性能 PHP 扩展时&#xff0c;Rust 因其内存安全与零成本抽象的特性&#xff0c;成为理想的选择。通过 Rust 编写 PHP 扩展&#xff0c;核心挑战之一是实现两种语言运行时之间的内存安全交互。PHP 使用 Zend 引擎管理变量…

作者头像 李华
网站建设 2026/4/22 14:42:59

【PHP 8.6性能飞跃核心】:JIT编译缓存策略深度解析与实战优化

第一章&#xff1a;PHP 8.6 JIT编译缓存的演进与核心价值PHP 8.6 对内置的JIT&#xff08;Just-In-Time&#xff09;编译器进行了深度优化&#xff0c;尤其在编译缓存机制方面实现了关键性突破。这一版本通过引入持久化JIT opcode缓存&#xff0c;显著降低了动态语言在运行时的…

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

Android学Dart学习笔记第十五节 类

文档描述 Dart is an object-oriented language with classes and mixin-based inheritance. Every object is an instance of a class, and all classes except Null descend from Object. Mixin-based inheritance means that although every class (except for the top clas…

作者头像 李华