LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass

开篇

当初第一次面试前端,上来就甩这道题,我傻乎乎写了双层循环,面试官笑着问我有没有更优解,当场卡壳。后来才明白,这题看着简单,实则是哈希表入门天花板,能不能想出 O (n) 解法直接区分刷题新手和老手。

题目简述

给一个数字数组和目标和 target,找出数组里相加等于 target 的两个数字,返回它们的下标。限制条件很关键:数组只有唯一一组答案,同一个元素不能用两次,下标顺序随便返回。

第一种思路:暴力双层循环(新手第一反应)

拿到题第一眼,我脑子里第一个念头就是挨个配对。说白了就是固定第一个数,再遍历后面所有数求和判断。拿示例 [2,7,11,15] target=9 举例:先拿 2,往后依次加 7、11、15,2+7 刚好等于 9,直接返回 0 和 1。

JS 暴力代码

javascript 复制代码
var twoSum = function(nums, target) {
    // 外层固定第一个数字
    for(let i = 0; i < nums.length; i++) {
        // j从i+1开始,避免同一个元素重复使用
        for(let j = i + 1; j < nums.length; j++) {
            if(nums[i] + nums[j] === target) {
                return [i, j]
            }
        }
    }
};

复杂度:两层循环嵌套,时间 O (n²),空间 O (1)。数组长度上限是 10⁴,极端情况会循环上亿次,直接超时,面试写这个大概率扣分。

第二种思路:哈希表,一次遍历搞定(最优解)

面试官想要的就是这个方法,我当时没转过弯,后来想通逻辑后直呼巧妙。核心逻辑:我们要找 a + b = target,等价于 b = target - a。遍历数组的时候,用 map 存已经走过的数字和它的下标。每拿到当前数字 a,先去 map 里查有没有 target - a 这个 b:

  1. 存在:直接取出 b 的下标,和当前 i 一起返回
  2. 不存在:把当前数字 a 和下标存入 map,继续往下走

还是用示例 [2,7,11,15] target=9 走一遍流程:

  1. i=0,数字 = 2,需要找 9-2=7,map 是空的,存入 {2:0}
  2. i=1,数字 = 7,需要找 9-7=2,map 里刚好有 2,对应下标 0,返回 0,1,遍历直接结束

这里有个坑我踩过:不要先把全部数字放进 map 再遍历,遇到 [3,3] target=6 这种用例,会直接拿到同一个下标 0。边遍历边存就能完美避开,因为只会匹配前面已经存入的元素,不会匹配自己。

JS 哈希表完整代码

javascript 复制代码
var twoSum = function(nums, target) {
    // key:数组数字,value:数字对应的下标
    const map = new Map();
    for(let i = 0; i < nums.length; i++) {
        const cur = nums[i];
        // 计算我们需要配对的另一个数字
        const need = target - cur;
        // 如果map里存在这个数字,直接返回下标
        if(map.has(need)) {
            return [map.get(need), i]
        }
        // 找不到就把当前数字存进map,留给后面的数字配对
        map.set(cur, i)
    }
};

复杂度:只遍历一次数组,时间 O (n),空间 O (n),用哈希空间换时间,进阶要求直接满足。

两种解法简单对比

暴力循环不用额外空间,但数据量大就超时,适合刚入门理解题意;哈希表牺牲一点内存,换来线性时间,是面试标准答案,也是日常开发推荐写法。

总结 & 互动

这道题看着简单,其实是在考察你会不会用哈希表优化查询,很多人卡就卡在没想到转换等式 b = target - a。我当初踩的大坑:双层循环写得飞起,完全没往哈希表上想,面试当场尴尬住。另外注意题目限制,数组里会有重复数字,边遍历边存 map 的写法才能处理 [3,3] 这种案例。

你面试有没有被问到过这道两数之和?最开始写的是暴力解法还是哈希?评论区聊聊,每条我都会回。如果这篇题解帮你理清了思路,点个赞让更多刷题的小伙伴看到~

相关推荐
GuWenyue3 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
何时梦醒3 小时前
深入理解递归与快速排序 —— 从基础入门到手写实现
前端·javascript
bonechips3 小时前
LLM 的无状态:从 HTTP 协议到对话上下文工程
前端·javascript
胡志辉3 小时前
从 prototype 到 V8,看懂 JavaScript 原型链
前端·javascript
ping某5 小时前
专栏-null 和 undefined 到底是什么?
前端·javascript·后端
鱼鱼不愚与6 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
swipe7 小时前
从 0 到 1 理解 React 虚拟列表:定高、不定高与 Canvas 版本完整拆解
前端·javascript·面试
铁皮饭盒8 小时前
Bun执行python代码
前端·javascript·后端
zzzzzz31010 小时前
当甲方说'logo放大的同时再缩小一点'时,我用 AI 把这个需求做出来了
javascript·css·程序员