题目基础信息题目序号LeetCode 1. 两数之和题目难度Easy简单题目地址https://leetcode.cn/problems/two-sum/题目标签数组、哈希表 题目描述给定一个整数数组nums和一个整数目标值target请你在该数组中找出和为目标值的那两个整数并返回它们的数组下标。✅ 题目约束每种输入只会对应一个有效答案不能重复使用同一个元素可以按任意顺序返回最终结果下标 题目进阶要求尝试设计一个时间复杂度优于O(n²)的算法️ 题目示例示例1输入nums [2,7,11,15], target 9输出[0,1] 解释nums[0] nums[1] 2 7 9示例2输入nums [3,2,4], target 6输出[1,2]示例3输入nums [3,3], target 6输出[0,1] 数据范围提示数组长度2 nums.length 10^4数值范围-10^9 nums[i] 10^9目标值范围-10^9 target 10^9 解题总览本篇收录三种完整解法由浅入深覆盖新手学习、刷题、面试全场景Java 双层暴力循环零门槛理解适合入门算法思维JS 原生 Object 哈希表通俗“小本本”写法新手友好易懂易学JS Map 哈希表最优解规范标准写法面试、刷题首选效率最高 解法一暴力枚举双层循环1. 解题思路暴力解法是新手最容易理解的基础解法核心思路是枚举所有两数组合具体步骤如下第一层循环固定数组中当前遍历的元素nums[i]第二层循环从i 1位置开始遍历后续元素避免重复使用同一个元素、避免重复比对组合判断两数之和是否等于目标值匹配成功直接返回双下标[i, j]题目保证唯一解找到结果即可直接终止遍历2. 完整代码publicclassSolution{publicint[]twoSum(int[]nums,inttarget){// 固定第一个数for(inti0;inums.length;i){// 第二个数从 i1 开始遍历避免重复使用同一元素、避免重复组合for(intji1;jnums.length;j){// 匹配目标值直接返回双下标if(nums[i]nums[j]target){returnnewint[]{i,j};}}}// 题目保证有唯一解兜底返回空数组returnnewint[]{};}}3. ⏱️ 复杂度分析时间复杂度O(n²)双层嵌套循环数据量较大时会超时空间复杂度O(1)仅使用常数级临时变量无额外内存开销4. ✅ 优缺点总结优点逻辑直白、零算法门槛、无需额外数据结构新手极易理解缺点时间效率差无法通过大数据测试用例仅适合入门学习面试不推荐⚡ 解法二JS 原生 Object 哈希表1. 解题思路暴力解法效率低的核心原因是重复遍历哈希解法采用空间换时间的经典算法思想只用一次遍历即可解题新手友好的“小本本”逻辑如下定义空对象作为备忘录记录已遍历数字 : 对应下标通过公式搭档数 target - 当前数字反向求解需要匹配的数值优先在备忘录中查找搭档数存在则直接返回双下标未找到则将当前数字和下标存入备忘录继续遍历核心关键先查找、后存储从根源避免元素重复使用符合题目规则。核心顺序先查找后存储完美避免自己和自己匹配满足题目不能重复使用同一元素的要求。2. 完整代码functiontwoSum(nums,target){constprevNums{};// 准备一个空白小本本记录走过的数字和下标for(leti0;inums.length;i){// 逐个走数组里的数字constcurNumnums[i];// 拿到当前这个数字consttargetNumtarget-curNum;// 算还缺哪个数才能凑目标consttargetNumIndexprevNums[targetNum];// 翻本本找这个“缺的数”if(targetNumIndex!undefined){// 本本里找到了缺的数 → 答案出现返回两个下标return[targetNumIndex,i];}else{// 本本里没找到 → 把当前数字位置记进本本prevNums[curNum]i;}}return[];}3. ⏱️ 复杂度与特点时间复杂度O(n)仅遍历数组一次效率极高空间复杂度O(n)需要额外空间存储遍历过的数值下标特点代码拟人化、通俗易懂非常适合新手理解哈希表“记录-查找”的核心原理 解法三JS Map 哈希表面试最优版1. 解题思路整体逻辑和 Object 哈希解法完全一致同样遵循一次遍历、先查后存的规则唯一区别是使用 JS 标准Map结构存储数据优势如下Map 是专业键值对存储结构无隐式类型转换问题API 语义清晰has/get/set代码更规范适配所有特殊测试用例刷题、面试通用2. 完整代码consttwoSum(nums,target){// 新建空 Map用来记录数字 → 对应下标constmapnewMap();// 遍历数组每一个元素for(leti0;inums.length;i){// 计算需要凑数的另一半搭档数constdifftarget-nums[i];// 如果 Map 里已经有这个搭档数说明找到答案if(map.has(diff)){// 返回 [搭档数下标, 当前下标]return[map.get(diff),i];}// 没找到就把当前数字和下标存进 Mapmap.set(nums[i],i);}return[];};3. ✨ 特点优势性能稳定不丢失精度适配全部 LeetCode 测试用例写法专业规范是前端面试、算法刷题的首选最优解相比原生 Object 写法容错率更高工程性更强 三种解法全面对比解法时间复杂度空间复杂度适用场景Java 暴力双层循环O(n²)O(1)新手入门理解遍历逻辑JS Object 哈希表O(n)O(n)新手学习哈希思想原理JS Map 哈希表O(n)O(n)刷题、面试、正式提交首选⚠️ 核心易错点总结刷题过程中极易踩坑的核心要点务必牢记遍历顺序不能颠倒必须先查找、后存储否则会匹配到自身元素违反题目规则返回值区分题目要求返回数组下标不是数组数值切忌混淆两种哈希区别Object 和 Map 逻辑完全一致仅语法差异新手学 Object 理解原理面试写 Map 保证规范复杂度取舍哈希解法牺牲少量内存将时间复杂度从 O(n²) 优化至 O(n)是算法「空间换时间」的经典示范