15分钟解LeetCode

发布时间:2026/5/25 20:56:53

15分钟解LeetCode 算法面试不是会不会而是多快能写对。给你15分钟一道真实LeetCode题没有提示、没有调试器、只有白板心态。本文还原一场解LeetCode的全过程从读题、破题、写代码到边界检查完整呈现一个工程师的思维速度与工程落地能力。一、规则项目规则时间15分钟倒计时题目LeetCode真实中等难度题环境纯文本编辑器无智能提示目标写出可运行的、覆盖边界的代码评分正确性(60%) 代码质量(20%) 完成时间(20%)二、题目给你一个整数数组nums判断是否存在三元组[nums[i], nums[j], nums[k]]满足i ! j ! k且nums[i] nums[j] nums[k] 0。返回所有和为0且不重复的三元组。示例nums [-1,0,1,2,-1,-4]→ 输出[[-1,-1,2],[-1,0,1]]约束3 nums.length 3000-10^5 nums[i] 10^5难度中等核心考察双指针 去重 边界条件三、全程实录00:00 - 02:00 | 读题 破题扫读关键信息数组长度最大3000 → O(n²)可接受O(n³)不行有重复元素 → 需要去重返回三元组不是下标 → 排序不影响结果思维路径三数之和 固定一个数 两数之和问题 两数之和可以用双指针 O(n) 解决 外层固定一个数遍历 O(n) 总复杂度 O(n²)可接受选择方案排序 双指针排序 → 固定i → 双指针li1, rn-1 → 移动指针寻找和为 -nums[i]02:00 - 05:00 | 手写代码框架func threeSum(nums []int) [][]int { sort.Ints(nums) result : [][]int{} n : len(nums) for i : 0; i n-2; i { // 去重跳过重复的固定元素 if i 0 nums[i] nums[i-1] { continue } target : -nums[i] l, r : i1, n-1 for l r { sum : nums[l] nums[r] if sum target { result append(result, []int{nums[i], nums[l], nums[r]}) // 去重跳过重复的左右指针 for l r nums[l] nums[l1] { l } for l r nums[r] nums[r-1] { r-- } l r-- } else if sum target { l } else { r-- } } } return result }05:00 - 10:00 | 边界测试与修复测试用例思维跑表用例预期代码能否通过[-1,0,1,2,-1,-4][[-1,-1,2],[-1,0,1]]✅[0,0,0,0][[0,0,0]]✅ 去重逻辑正确[-2,0,1,1,2][[-2,0,2],[-2,1,1]]✅[1,2,3,4][]✅[][]✅ n3返回空发现潜在问题当nums[i]已经大于0时后面的数都大于0三数之和不可能为0。优化添加提前终止条件for i : 0; i n-2; i { if nums[i] 0 { break // 后面的数都当前数和不可能为0 } // ... 原有逻辑 }10:00 - 12:00 | 复杂度分析与Edge Cases文档化复杂度时间O(n²) — 外层循环O(n) × 内层双指针O(n)空间O(1) — 不计输出结果Edge Cases清单数组长度 3 → 直接返回空所有数 0 → 提前终止所有数 0 → 需要遍历完全0 → 只返回一组[0,0,0]重复元素 → 三重去重i层、l层、r层12:00 - 15:00 | 最终代码优化与提交最终版本func threeSum(nums []int) [][]int { if len(nums) 3 { return [][]int{} } sort.Ints(nums) result : make([][]int, 0) n : len(nums) for i : 0; i n-2; i { // 剪枝最小的数都大于0后面不可能有解 if nums[i] 0 { break } // i层去重 if i 0 nums[i] nums[i-1] { continue } target : -nums[i] l, r : i1, n-1 for l r { sum : nums[l] nums[r] if sum target { result append(result, []int{nums[i], nums[l], nums[r]}) // l层去重 for l r nums[l] nums[l1] { l } // r层去重 for l r nums[r] nums[r-1] { r-- } l r-- } else if sum target { l } else { r-- } } } return result }四、复盘4.1 时间分布阶段用时关键产出读题破题2分钟确定排序双指针方案写代码框架3分钟核心循环双指针逻辑边界测试与修复5分钟三重去重剪枝优化复杂度分析2分钟文档化Edge Cases最终优化3分钟提交前检查4.2 关键决策记录决策点选择理由是否排序排序不改变结果双指针前提去重位置i层、l层、r层三处避免重复三元组剪枝条件nums[i] 0提前终止常数优化数据结构切片[][]intGo惯用法4.3 易错点对照易错点错误写法正确写法去重位置错误只在最后去重在移动指针时同步去重越界访问nums[i] nums[i1]i 0 nums[i] nums[i-1]漏掉零解跳过所有重复保留[0,0,0]这种情况五、自测表完成一道题后用以下维度自评维度优秀(5分)及格(3分)不及格(1分)自评破题速度2分钟内出方案5分钟内5分钟5代码正确性一次通过1-2次调试2次4边界覆盖全部考虑主要边界遗漏关键边界5代码可读性命名清晰、有注释基本清晰变量名混乱4复杂度分析准确且优化仅给出复杂度不会分析5总分23 → 可优化点提交前快速跑3个测试用例六、训练法6.1 每日训练计划阶段内容时长热身看一道已做过的题口述思路5分钟快闪新题限时15分钟15分钟复盘对比最优解记录差距10分钟归档存入个人题库标注易错点5分钟6.2 题型优先级优先级题型考察重点刷题占比P0数组、哈希表、双指针基础数据结构30%P0二叉树遍历递归/迭代20%P1动态规划状态转移20%P1滑动窗口、前缀和连续子数组15%P2图论、回溯搜索剪枝15%6.3 15分钟倒计时心态法则0-3分钟读题确定方案 3-10分钟写代码框架 核心逻辑 10-13分钟补边界 去重 剪枝 13-15分钟跑脑内测试用例 修正铁律超过3分钟还没思路先写暴力解拿部分分不要空着。七、写在最后算法快闪的核心不是难题怪题而是在有限时间内把一道中等题完整地、高质量地写出来。这道三数之和涵盖了排序预处理双指针算法三重去重逻辑剪枝优化边界条件全覆盖如果你能在15分钟内独立完成说明你的思维速度和工程落地能力已经通过了实战检验。

相关新闻