LeetCode HOT 100 Java刷题笔记:从两数之和到每日温度,我的秋招通关秘籍
LeetCode HOT 100 Java刷题笔记从两数之和到每日温度我的秋招通关秘籍去年此时我和大多数准备秋招的同学一样面对LeetCode浩如烟海的题目感到无从下手。直到一位学长告诉我吃透HOT 100足够应对80%的技术面试。经过三个月的系统刷题我最终收获了包括BAT在内的5个offer。这份笔记不仅记录了我的解题思路更包含了一套可复制的刷题方法论。1. 如何科学规划HOT 100刷题路线盲目刷题是效率最低的学习方式。我将HOT 100题目按算法类型重新分类并制定了渐进式学习计划核心分类策略基础数据结构20%链表、二叉树、栈/队列算法思想60%双指针、DFS/BFS、动态规划、贪心特殊题型20%设计题、数学题、位运算建议先从「数据结构」类题目入手建立解题信心后再攻克动态规划等难点我的每日学习节奏上午9-11点新题型学习2道 下午3-5点同类题型强化3-4道 晚上8-9点错题复盘重点标注易错点优先级排序表难度建议顺序代表题目★★☆第一阶段两数之和、反转链表★★★第二阶段接雨水、LRU缓存★★☆第三阶段每日温度、任务调度器2. 突破算法思维的三大瓶颈2.1 动态规划的状态定义恐惧症很多同学卡在DP问题是因为总想一步到位。我的破解方法是先写暴力递归解法找出重复计算子问题用备忘录优化自顶向下最后改写成DP表格自底向上以「322. 零钱兑换」为例// 阶段一暴力递归 int dfs(int[] coins, int amount) { if(amount 0) return 0; int res Integer.MAX_VALUE; for(int coin : coins) { if(amount coin) { int sub dfs(coins, amount - coin); if(sub ! -1) res Math.min(res, sub 1); } } return res Integer.MAX_VALUE ? -1 : res; } // 阶段四DP优化 public int coinChange(int[] coins, int amount) { int[] dp new int[amount1]; Arrays.fill(dp, amount1); dp[0] 0; for(int i1; iamount; i) { for(int coin : coins) { if(i coin) { dp[i] Math.min(dp[i], dp[i-coin]1); } } } return dp[amount] amount ? -1 : dp[amount]; }2.2 二叉树遍历的递归/迭代选择递归写法虽然简洁但面试官常要求用迭代实现。我的对比笔记前序遍历迭代模板public ListInteger preorderTraversal(TreeNode root) { ListInteger res new ArrayList(); DequeTreeNode stack new ArrayDeque(); while(root ! null || !stack.isEmpty()) { while(root ! null) { res.add(root.val); // 访问在前 stack.push(root); root root.left; } root stack.pop().right; } return res; }2.3 滑动窗口的边界处理「76. 最小覆盖子串」让我栽了三次跟头总结出窗口移动的黄金法则右指针探索可行解左指针优化可行解窗口收缩条件要明确关键代码段while(right s.length()) { char c s.charAt(right); if(need.containsKey(c)) { window.put(c, window.getOrDefault(c,0)1); if(window.get(c).equals(need.get(c))) valid; } while(valid need.size()) { // 更新结果 if(right - left len) { start left; len right - left; } // 收缩窗口 char d s.charAt(left); if(need.containsKey(d)) { if(window.get(d).equals(need.get(d))) valid--; window.put(d, window.get(d)-1); } } }3. 从题目到面试的思维跃迁面试官从不期待你背题而是考察举一反三的能力。我的转化方法案例一「42. 接雨水」的三种解法对应不同考察点暴力法 → 基础编码能力动态规划 → 空间换时间思维双指针 → 优化意识案例二「239. 滑动窗口最大值」的进阶思考为什么不能用大顶堆单调队列的时间复杂度优势实际工程中的应用场景如流量控制我在面试中被问到的变形题 如果数据流持续不断如何实时返回当前窗口的最大值 —— 这正是「剑指Offer」中的队列最大值问题4. 笔记系统的构建技巧好笔记是复习的利器我的笔记包含五个维度核心思路用流程图解构算法步骤复杂度分析明确时间/空间消耗易错点标注边界条件和陷阱相似题目建立题目间的关联口语化解释准备面试时的表述方式例如在「148. 排序链表」的笔记中## 归并排序实现要点 - 快慢指针找中点时注意断开前后链表prev.next null - 合并两个有序链表的递归写法更简洁 - 空间复杂度O(1)的关键利用原有节点 面试官可能追问为什么不用快速排序 答链表交换元素成本高且递归栈空间不满足O(1)要求最后三个月我的笔记本迭代了四个版本从最初的代码堆积到最后的思维导图这个过程本身就是算法思维的成长轨迹。记住刷题不是目的培养解决问题的通用能力才是关键。当你能把「接雨水」的解法迁移到实际开发中的流量控制问题时面试官看到的不仅是编程能力更是工程师的思维品质。