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

力扣刷题#1:两数之和_从暴力解法到哈希表优化

两数之和:从暴力解法到哈希表优化

题目描述

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

示例:

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

思路一:暴力枚举(O(n²))

最直观的方法是两层循环枚举所有数对,检查它们的和是否等于 target。

第一次尝试(有 bug)

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; i++)   // 错误:这里是 i++{if(nums[i] + nums[j] == target){return {i, j};}}}return {};}
};

运行后出现 heap-buffer-overflow 错误,因为内层循环误将 i++ 写成了 j++,导致 i 在内层循环中不断自增,很快超出数组范围,访问非法内存。

修正后的暴力解法

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++)   // 正确:j++{if(nums[i] + nums[j] == target){return {i, j};}}}return {};}
};
复杂度
时间复杂度 O(n²)
空间复杂度 O(1)

提示:直接写 i < nums.size()-1 会有风险,因为 nums.size() 返回 size_t(无符号整数),当数组为空时 size()-1 会下溢成一个极大值,导致循环条件永远为真。推荐先用 int n = nums.size(); 保存长度。


思路二:哈希表(O(n))

暴力解法虽然简单,但面试官通常会要求更优解。我们可以利用哈希表将查找 target - x 的时间从 O(n) 降到 O(1)。

核心思想

遍历数组,对于每个元素 nums[i],计算 complement = target - nums[i]

  1. 在哈希表中查找 complement:
    • 如果存在,说明之前已经遍历过这个补数,直接返回两个下标。
    • 如果不存在,将 (nums[i], i) 存入哈希表,继续向后遍历。

常见错误:将迭代器赋值给 int

初学者的一个典型错误是:

int it = hash.find(target - nums[i]);   // 错误!

unordered_map::find() 返回的是迭代器,不是整数。迭代器可以理解为指向 pair<const Key, Value> 的指针,不能直接赋给 int

正确的做法是用 auto 接收迭代器,然后判断是否等于 hash.end()

auto it = hash.find(complement);
if (it != hash.end()) {return {it->second, i};
}

正确实现

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash;   // 值 -> 下标int n = nums.size();for (int i = 0; i < n; i++) {int complement = target - nums[i];auto it = hash.find(complement);if (it != hash.end()) {return {it->second, i};   // it->second 是先前元素的下标}hash[nums[i]] = i;            // 将当前元素加入哈希表}return {};}
};

复杂度分析

复杂度 说明
时间复杂度 O(n) 每个元素插入和查找哈希表的平均时间复杂度为 O(1)
空间复杂度 O(n) 哈希表最多存储 n-1 个元素

关于哈希表查找复杂度的补充说明

很多人会误以为哈希表查找是 O(n),这里澄清一下:

查找方式 过程 复杂度
数组线性查找 逐个比较 最坏 O(n)
哈希表查找 计算哈希值 → 直接定位到桶 → 少量比较 平均 O(1)

只有在哈希函数极差或大量冲突时才会退化到 O(n),但在实际算法题和标准库实现中,我们按 O(1) 分析。


总结

方法 时间复杂度 空间复杂度 说明
暴力枚举 O(n²) O(1) 思路简单,但大数据量下会超时
哈希表 O(n) O(n) 空间换时间,推荐解法

两数之和是 LeetCode 上的经典题目,掌握哈希表的优化思路对解决许多其他问题(如三数之和、四数之和)也很有帮助。


本文档有ai辅助生成元素,作者提供问题和思路,综合获得以上内容

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

相关文章:

  • 2026年佛山阻尼铰链与隐藏滑轨厂家全方位实力对标:全屋定制五金一站式选购避坑教程 - 企业名录优选推荐
  • VoiceFixer终极教程:3分钟学会AI语音修复,让模糊录音变清晰
  • 基于Arduino与PIR传感器的互动游戏装置设计与实现
  • 【技术管理】技术选型方法论:从需求到落地的决策指南
  • 三步解决B站视频下载难题:哔哩下载姬完全使用指南
  • 2026报考指南:四川文化艺术学院校园环境与设施介绍 - 品牌2025
  • 2026年美国移民公司深度解析:如何选择专业服务机构 - 品牌排行榜
  • 2026义乌公司注册代办执照集群地址托管十大实力星榜:本土服务商深度测评 - 企业品牌优选推荐官
  • AI智能体人才招引实操指南:破局人才缺口,构建区域AI产业优势
  • ComfyUI-WanVideoWrapper视频生成框架:PyTorch 2.0+编译优化与显存管理深度解析
  • 2026年佛山阻尼铰链与隐藏滑轨厂家多款好物同台比拼:顺德源头工厂选型避坑须知 - 企业名录优选推荐
  • 多尺度地理加权回归(MGWR):3步掌握空间异质性分析的终极指南
  • 基于ESP32C3与A9G的便携式GPS追踪器全栈开发实战
  • 义乌市拓成企业管理咨询有限公司调研白皮书:义乌公司注册与全生命周期企业服务的专业伙伴 - 企业品牌优选推荐官
  • 不懂佛山黄金回收怎么选,内行教你挑选高口碑正规渠道 - 奢侈品回收测评
  • TI CCS新手避坑指南:ARM和C6000工程编译后,如何正确配置Post-build生成bin文件?
  • 在算法的凝视下:品牌如何通过“真相审计”赢得AI信任票?
  • 3分钟搞定OFD转PDF:免费本地转换工具终极指南
  • 广州制造业GEO服务商推荐 - 舒雯文化
  • Go语言监控告警:生产环境运维
  • 有人说: 安装了个桌面版的OpenCode 。 和网页版有什么区别,?网页版大部分是一个平台,有的也有多个平台集成的。 通用AI客户端只装一个可以添加N个平台的API KEY
  • 如何高效使用JStillery:专业JavaScript反混淆工具的完整指南
  • 黑客利用 GHOSTYNETWORKS 和 OMEGATECH 托管 JS 恶意软件基础设施
  • 2026年Q2中国泰山石优质厂家首选推荐:合肥飞宇石业有限公司电话18895462999 - 安互工业信息
  • 2026重庆黄金回收门店大测评!老牌靠谱渠道完整种草攻略 - 奢侈品回收测评
  • 基于Teensy 4.1的模型火箭飞行计算机:从传感器融合到双伞回收控制
  • ComfyUI-WanVideoWrapper深度解析:PyTorch编译优化与显存管理实战指南
  • 3分钟掌握:网盘下载加速神器终极指南
  • 保姆级教程:在Mac上彻底卸载ABC输入法并精细调校搜狗(含SIP关闭指南)
  • 哇塞!原来毕业论文可以这样写?2026降AIGC工具推荐合集