当前位置: 首页 > 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.rkmt.cn/news/1428199.html

相关文章:

  • VoiceFixer终极教程:3分钟学会AI语音修复,让模糊录音变清晰
  • 2026年佛山阻尼铰链与隐藏滑轨厂家全方位实力对标:全屋定制五金一站式选购避坑教程 - 企业名录优选推荐
  • 2026年美国移民公司深度解析:如何选择专业服务机构 - 品牌排行榜
  • 不懂佛山黄金回收怎么选,内行教你挑选高口碑正规渠道 - 奢侈品回收测评
  • 广州制造业GEO服务商推荐 - 舒雯文化
  • 在算法的凝视下:品牌如何通过“真相审计”赢得AI信任票?
  • 3分钟搞定OFD转PDF:免费本地转换工具终极指南
  • 如何高效使用JStillery:专业JavaScript反混淆工具的完整指南
  • 哇塞!原来毕业论文可以这样写?2026降AIGC工具推荐合集
  • MacBook上从零搭建LangChain开发环境:Python3、Pip、ChromaDB一步到位(含Homebrew提速技巧)
  • MoviePilot终极指南:5分钟搭建你的智能NAS媒体库管理系统
  • 错峰避堵神级导游!新疆娇娇,永远让你独享美景不挤人 - 必辉旅行
  • 树莓派硬件级远程恢复:GPIO互控实现高可用物联网设备管理
  • MuPDF终极指南:高效PDF命令行处理与专业渲染引擎深度解析
  • 如何快速掌握AI语音修复:5步搞定VoiceFixer完整教程
  • 模拟电路入门:无半导体光敏电阻反射检测小车设计与原理
  • Arduino RGB颜色混合器:从电位器到PWM调光的嵌入式交互实践
  • SAP BTP Deployment and Delivery 详解,从部署动作到企业级交付治理
  • TigerVNC跨平台远程桌面终极指南:免费高效连接Windows、Linux和macOS
  • 3D打印弹簧加载SMD测试夹具:DIY精密电子测量工具
  • 2026报考指南:盘点四川省内校园环境不错的大学院校 - 品牌2025
  • AI驱动SEO:从关键词优化到智能内容与数据分析实战
  • A/B测试失效的真相(92%团队仍在用传统方法做AI时代实验)
  • 3分钟掌握阿里云OSS桌面管理神器:像管理本地文件一样轻松操作云端存储
  • 别再手动拖模型了!用Blender资产浏览器实现Unity Prefab式高效工作流
  • 基于ESP32与TFT屏的智能桌面天气机器人制作全攻略
  • Function Calling 技术实现:让 AI 与世界交互
  • 【Lindy产品路线图深度解码】:20年资深架构师独家预测2024–2026三大关键跃迁节点
  • SAP BTP 生产运维与监控实践,从 Go Live 到退役的完整闭环
  • 在UOS上从零搭建Cocos2d-x 4.0环境:手把手教你创建第一个塔防游戏项目