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

【LeetCode】1. 两数之和(Two Sum)— 哈希表经典题解(C语言)

一、题目描述

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

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

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

示例 1

输入: nums = [2,7,11,15], target = 9 输出: [0,1] 解释: nums[0] + nums[1] == 9

示例 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⁹

  • 只会存在一个有效答案


二、解题思路

这道题是LeetCode 最经典的哈希表题目之一,也是很多面试的入门题。

常见解法有两种:

1️⃣ 暴力枚举
2️⃣ 哈希表优化(推荐)


三、方法一:暴力枚举

思路

最直接的方法就是两层循环枚举所有组合

  1. 第一个循环选择第一个数nums[i]

  2. 第二个循环选择第二个数nums[j]

  3. 判断:

nums[i] + nums[j] == target

如果成立,则返回两个下标。


动图思路

假设数组:

[2,7,11,15]

target = 9

枚举过程:

2 + 7 = 9 ✔

返回:

[0,1]

C语言代码

#include <stdlib.h> int* twoSum(int* nums, int numsSize, int target, int* returnSize) { int* res = (int*)malloc(sizeof(int) * 2); for(int i = 0; i < numsSize; i++) { for(int j = i + 1; j < numsSize; j++) { if(nums[i] + nums[j] == target) { res[0] = i; res[1] = j; *returnSize = 2; return res; } } } *returnSize = 0; return NULL; }

复杂度分析

复杂度数值
时间复杂度O(n²)
空间复杂度O(1)

当数组较大时,效率会明显下降。


四、方法二:哈希表(推荐)⭐

核心思想

如果:

a + b = target

那么:

b = target - a

遍历数组时:

  1. 计算当前数需要的补数

complement = target - nums[i]
  1. 查询哈希表中是否存在该补数

  • 如果存在 → 找到答案

  • 如果不存在 → 将当前数字存入哈希表

这样只需要遍历一次数组


执行过程示例

数组:

[2,7,11,15]

target = 9

遍历过程:

inums[i]补数哈希表
027存入2
172找到2 ✔

返回:

[0,1]

五、C语言实现(哈希表)

由于 C 语言没有内置哈希表,我们可以用链地址法实现简单哈希表

#include <stdlib.h> #define SIZE 20011 typedef struct Node { int key; int value; struct Node* next; }Node; Node* hashTable[SIZE]; int hash(int key) { if(key < 0) key = -key; return key % SIZE; } void insert(int key, int value) { int h = hash(key); Node* node = (Node*)malloc(sizeof(Node)); node->key = key; node->value = value; node->next = hashTable[h]; hashTable[h] = node; } int find(int key) { int h = hash(key); Node* cur = hashTable[h]; while(cur) { if(cur->key == key) return cur->value; cur = cur->next; } return -1; } int* twoSum(int* nums, int numsSize, int target, int* returnSize) { for(int i = 0; i < SIZE; i++) hashTable[i] = NULL; int* res = (int*)malloc(sizeof(int) * 2); for(int i = 0; i < numsSize; i++) { int complement = target - nums[i]; int index = find(complement); if(index != -1) { res[0] = index; res[1] = i; *returnSize = 2; return res; } insert(nums[i], i); } *returnSize = 0; return NULL; }

六、复杂度分析

复杂度数值
时间复杂度O(n)
空间复杂度O(n)

因为只遍历了一次数组,所以效率非常高。


七、总结

方法时间复杂度空间复杂度
暴力枚举O(n²)O(1)
哈希表O(n)O(n)

在实际面试中,哈希表解法是最推荐的方案

核心思想可以总结为一句话:

在遍历数组时,利用哈希表快速查找当前数字所需要的补数。


八、延伸题目

Two Sum 是很多题目的基础,例如:

    1. 三数之和(Three Sum)

    1. 四数之和(Four Sum)

    1. 两数之和 II(有序数组)

掌握 Two Sum 的哈希表思想,可以帮助解决很多类似问题。


如果这篇文章对你有帮助,欢迎点赞 + 收藏 + 关注
后续会持续更新LeetCode 面试经典 150 题 C 语言题解专栏

http://www.jsqmd.com/news/467393/

相关文章:

  • ESP32-S3 基础介绍
  • 探索 COMSOL 中含裂缝地层的流动与传热耦合模拟:油藏数值模拟实战
  • 基于二进制粒子群算法的配电网故障诊断—Matlab 应用选取配电网故障诊断,采用二进制粒子群优化算法
  • 自动药片装瓶机的“神经中枢“是如何炼成的
  • CPU_多线程操作图片_代码详解
  • 纯电动汽车动力经济性仿真:Cruise 与 Simulink 联合之旅
  • 【教学类-133-01】20260309狮虎旗(井字棋)01豆包初稿HTML+ CSS + JavaScript
  • 西门子200smart模拟量处理:滤波与报警的完美结合
  • 从DeepSig RadioML 2018.01A到定制化数据集:单信噪比单调制数据的提取与实战应用
  • 玩转PLC液体混合作业线(附全套工业组态方案)
  • 性价比优先:预算低情景下自动化立体仓库公司的选型指南 - 品牌策略主理人
  • Claude Code Hooks 实战:8大事件与10+脚本的自动化开发指南
  • STM32四轴联动运动控制:直线圆弧插补技术,编码器反馈与加减速控制,原理图和源代码全解析
  • 猎翼无人机,提升探测效率:2026军用目标识别无人机蜂群系统供应商推荐 - 品牌2026
  • 探索风光储交流微网中的双向储能变流器
  • 【小龙虾-OpenClaw】Railway如何部署小龙虾-OpenClaw
  • Hutool StrUtil 实战技巧:提升Java字符串处理效率
  • PAT-Broken Keyboard (20)
  • api接口
  • 保姆级教程:在海光hygon c86 7151上安装定制版Ubuntu18.04避坑全记录
  • QT集成QRencode与Code128:从源码集成到界面绘制的条码生成实践
  • 2026年耐磨复合管优质品牌推荐指南:连续玻纤带聚乙烯复合管厂家/钢纤增强聚乙烯复合压力管厂家/选择指南 - 优质品牌商家
  • 方向盘后的数学游戏:用MPC玩转四驱电动车轨迹跟踪
  • 猎翼无人机,探测识别二合一:2026军用目标监控无人机蜂群系统供应商推荐 - 品牌2026
  • 海康威视摄像头RTSP流接入YOLOv5的3个常见坑及解决方案(附完整代码)
  • 保姆级教程:用YOLOv10训练COCO数据集(附CUDA配置避坑指南)
  • MySql5.7下载与安装超详教程(保姆级教学)-mysql5.7安装配置教程
  • 益生菌哪个品牌效果最好?打工人告别腹脂囤积的实用指南 - 博客万
  • DFS文件服务器实战:用Winserver 2019实现跨机房文件自动同步
  • 解密京东联盟h5st 3.1:从加密原理到逆向调试技巧(含常见403解决方案)