🔥 从「开车看海」到「吊打两数之和」:一个前端菜鸡的算法逆袭之路
最近被一句话破防了:"有人相爱,有人夜里开车看海,有人 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);
}
};
这个解法就像给算法装了涡轮增压:
- 用 Map 存储已遍历的元素(时间复杂度 O (1))
- 每次查找补数只需 O (1) 时间
- 整体时间复杂度降为 O (n) ,比女朋友回消息还快 0.01 秒
📊 三种姿势对比:从青铜到王者
| 方法 | 时间复杂度 | 空间复杂度 | 执行效率 | 适用场景 |
|---|---|---|---|---|
| 双重循环 | O(n²) | O(1) | 🐢 | 面试初级阶段 |
| indexOf 优化 | O(n²) | O(1) | 🚲 | 快速实现 |
| 哈希表解法 | O(n) | O(n) | 🚀 | 生产环境、面试加分 |
🔥 面试加分技巧:如何优雅地写出三种解法
当面试官说 "讲讲两数之和" 时,你可以这样回答:
-
暴力解法:直观但效率低,适合快速实现
-
优化思路:用哈希表存储已遍历元素,将查找时间从 O (n) 降到 O (1)
-
进阶提问:如果数组有序,还可以用双指针法(时间 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 实现
推荐一些两数之和算法题的解题技巧和方法