从 "看海" 到 "看题解":我用三种 JavaScript 姿势搞定 LeetCode 第一题

102 阅读4分钟

🔥 从「开车看海」到「吊打两数之和」:一个前端菜鸡的算法逆袭之路

最近被一句话破防了:"有人相爱,有人夜里开车看海,有人 LeetCode 第一题都做不出来"。作为一个在厕所偷偷刷算法题的前端 er,我决定把两数之和的解题心路写成一篇掘金爆款 —— 毕竟谁不想从" 看题解 "逆袭成" 写题解 " 呢?

🚗 深夜 emo 现场:当浪漫邂逅算法

周末凌晨三点,别人在副驾看海,我在马桶上 debug:

javascript

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

这道 LeetCode 第一题《两数之和》,竟然让我卡了整整三小时!看着评论区大佬们花式秀操作,我默默打开了美团外卖 ——刷题饿了么,程序员深夜的尊严。

💪 青铜玩家:暴力破解法(小学生算术版)

作为一个前端切图仔,我的第一反应是:直接遍历不就完事儿了?

javascript

var twoSum = function(nums, target) {
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      if (nums[i] + nums[j] === target) {
        return [i, j];
      }
    }
  }
};

这段代码就像我初恋时写情书:简单、直接,但效率低下。双重循环的时间复杂度是 O (n²),当数组长度超过 1000 时,运行时间直接起飞 ——比女朋友回消息还慢

🚀 白银玩家:indexOf 优化(导航升级版)

为了不被大佬们笑话,我决定优化一下:

javascript

var twoSum = function(nums, target) {
  for (let i = 0; i < nums.length; i++) {
    const complement = target - nums[i];
    const j = nums.indexOf(complement);
    if (j !== -1 && j !== i) {
      return [i, j];
    }
  }
};

这个版本用indexOf代替内层循环,看似聪明了一点,但实际上只是从走路变成了骑自行车—— 时间复杂度仍然是 O (n²)。不过面试官看了会点点头:"至少知道用内置方法了"。

💎 黄金玩家:哈希表降维打击(无人机导航版)

真正的突破来自于某个凌晨四点的顿悟:用空间换时间!

javascript

var twoSum = function(nums, target) {
  const map = new Map();
  
  for (let i = 0; i < nums.length; i++) {
    const complement = target - nums[i];
    if (map.has(complement)) {
      return [map.get(complement), i];
    }
    map.set(nums[i], i);
  }
};

这个解法就像给算法装了涡轮增压:

  1. 用 Map 存储已遍历的元素(时间复杂度 O (1))
  2. 每次查找补数只需 O (1) 时间
  3. 整体时间复杂度降为 O (n) ,比女朋友回消息还快 0.01 秒

📊 三种姿势对比:从青铜到王者

方法时间复杂度空间复杂度执行效率适用场景
双重循环O(n²)O(1)🐢面试初级阶段
indexOf 优化O(n²)O(1)🚲快速实现
哈希表解法O(n)O(n)🚀生产环境、面试加分

🔥 面试加分技巧:如何优雅地写出三种解法

当面试官说 "讲讲两数之和" 时,你可以这样回答:

  1. 暴力解法:直观但效率低,适合快速实现

  2. 优化思路:用哈希表存储已遍历元素,将查找时间从 O (n) 降到 O (1)

  3. 进阶提问:如果数组有序,还可以用双指针法(时间 O (n),空间 O (1))

javascript

// 双指针解法(数组有序时适用)
var twoSum = function(nums, target) {
  let left = 0, right = nums.length - 1;
  while (left < right) {
    const sum = nums[left] + nums[right];
    if (sum === target) {
      return [left, right];
    } else if (sum < target) {
      left++;
    } else {
      right--;
    }
  }
};

💡 总结:从 "看题解" 到 "写题解"

通过这道题我发现,刷算法就像追女神:

  • 暴力解法:直接但容易翻车

  • 哈希表解法:巧妙但需要动脑子

  • 双指针解法:优雅但需要特定条件

现在每次看到两数之和,我都会想起那个凌晨三点的马桶时光。算法之路漫漫,愿我们都能从 "开车看海" 的青铜,成长为 "写题解" 的王者。

最后福利:关注我,私信 "两数之和",领取《LeetCode 刷题秘籍》电子版,内含 200 道高频题解析,让你从此告别 "看题解" 的日子!🚀

分享

在文章中添加一些常见的两数之和算法题的解题思路

再生成一个不同风格的标题,用 Python 实现

推荐一些两数之和算法题的解题技巧和方法