Java LeetCode Hot100 刷题学习指南

📅 2026/7/11 1:49:39
Java LeetCode Hot100 刷题学习指南
Java LeetCode Hot100 刷题学习指南刷题这件事最怕的不是题目难而是漫无目的地刷。本文档将带你从零基础开始用六天时间掌握 Hot100 中最核心的算法套路和模板让你真正做到刷一题会一类。一、学习方法论先背模板再谈理解作为新手你的目标不是发明算法而是识别题型并套用模板。记住80% 的算法题 固定模板 变量替换正确的学习顺序背模板把核心代码写到肌肉记忆抄题目照葫芦画瓢完成第一道题理解原理搞清楚模板为什么能解决问题举一反三用同一模板解决类似问题二、Day 1数组 哈希表 双指针基础打底这是最基础也最重要的一天几乎所有题目都会用到这些技巧。2.1 数组Array数组是一切的起点记住一个遍历模板就够了// 正序遍历for(inti0;inums.length;i){// 处理 nums[i]}// 倒序遍历用于原地修改for(intinums.length-1;i0;i--){// 处理 nums[i]}前缀和PreSum—— 快速算区间和int[]prenewint[nums.length1];for(inti0;inums.length;i){pre[i1]pre[i]nums[i];}// 求 nums[i] 到 nums[j] 的和intsumpre[j1]-pre[i];差分数组Diff—— 区间统一修改int[]diffnewint[nums.length];diff[0]nums[0];for(inti1;inums.length;i){diff[i]nums[i]-nums[i-1];}// 给 [l, r] 加 valdiff[l]val;if(r1diff.length)diff[r1]-val;记忆口诀区间统一加差分两头掐。左端加右端减最后前缀和还原。2.2 哈希表HashMap哈希表的核心是空间换时间把 O(n) 的查找变成 O(1)。基础操作必背MapInteger,IntegermapnewHashMap();map.put(key,value);// 放数据map.get(key);// 取数据不存在返回 nullmap.containsKey(key);// 判断有没有map.getOrDefault(key,0);// 取数据没有就给默认值高频三种高频用法用法模板典型题计数map.put(num, map.getOrDefault(num, 0) 1)两数之和、字母异位词存索引map.put(nums[i], i)两数之和分组map.computeIfAbsent(key, k - new ArrayList()).add(value)字母异位词分组重点computeIfAbsent是 Java 8 新增方法当 key 不存在时才创建新对象避免重复创建。2.3 双指针Two Pointers双指针的本质是用两个变量代替两层循环把 O(n²) 优化成 O(n)。快慢指针原地修改intslow0;for(intfast0;fastnums.length;fast){if(nums[fast]!val){nums[slow]nums[fast];}}returnslow;记忆口诀快指针找非零慢指针填坑。对撞指针有序数组intleft0,rightnums.length-1;while(leftright){intsumnums[left]nums[right];if(sumtarget)returnnewint[]{left1,right1};elseif(sumtarget)left;elseright--;}滑动窗口进阶MapCharacter,IntegerwindownewHashMap();intleft0,right0;while(rights.length()){charcs.charAt(right);right;window.put(c,window.getOrDefault(c,0)1);while(需要收缩窗口){chards.charAt(left);left;window.put(d,window.get(d)-1);}}2.4 Day 1 必刷题目题目类型难度1. 两数之和哈希表283. 移动零快慢指针242. 有效的字母异位词哈希表11. 盛最多水的容器对撞指针15. 三数之和双指针 去重3. 无重复字符的最长子串滑动窗口三、Day 2链表代码短但易出错链表是面试必考项核心是指针操作和边界处理。3.1 链表结构classListNode{intval;ListNodenext;ListNode(intx){valx;}}3.2 五大套路套路一虚拟头节点删除题必备ListNodedummynewListNode(-1);dummy.nexthead;ListNodecurdummy;为什么要用虚拟头避免处理头节点为空的特殊情况。套路二反转链表面试之王ListNodeprevnull;ListNodecurhead;while(cur!null){ListNodenextcur.next;cur.nextprev;prevcur;curnext;}returnprev;记忆口诀保存下一个反转指针移动 prev 和 cur。套路三快慢指针找中点/判环ListNodeslowhead,fasthead;while(fast!nullfast.next!null){slowslow.next;fastfast.next.next;}// slow 就是中点套路四删除倒数第 N 个节点ListNodedummynewListNode(0,head);ListNodefastdummy,slowdummy;for(inti0;in;i)fastfast.next;while(fast.next!null){fastfast.next;slowslow.next;}slow.nextslow.next.next;returndummy.next;3.3 Day 2 必刷题目题目类型难度206. 反转链表指针翻转21. 合并两个有序链表递归/迭代19. 删除链表的倒数第 N 个节点快慢指针141. 环形链表快慢指针25. K 个一组翻转链表进阶四、Day 3栈 / 队列 / 字符串 / 滑动窗口4.1 栈Stack—— 后进先出StackIntegerstacknewStack();stack.push(x);// 入栈stack.pop();// 出栈stack.peek();// 查看栈顶stack.isEmpty();// 是否为空经典应用有效的括号StackCharacterstacknewStack();for(charc:s.toCharArray()){if(c()stack.push());elseif(c{)stack.push(});elseif(c[)stack.push(]);elseif(stack.isEmpty()||stack.pop()!c)returnfalse;}returnstack.isEmpty();4.2 队列Queue—— 先进先出QueueIntegerqueuenewLinkedList();queue.offer(x);// 入队queue.poll();// 出队queue.peek();// 查看队首4.3 字符串操作s.charAt(i);// 获取第 i 个字符s.substring(i,j);// 截取 [i, j)s.toCharArray();// 转字符数组s.equals(other);// 比较内容别用 s.length();// 长度4.4 Day 3 必刷题目题目类型难度20. 有效的括号栈155. 最小栈栈设计739. 每日温度单调栈3. 无重复字符的最长子串滑动窗口76. 最小覆盖子串滑动窗口五、Day 4二叉树 DFS/BFS重中之重二叉树是算法世界的通用货币掌握它几乎能解决一半的面试题。5.1 二叉树结构classTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intx){valx;}}5.2 四种遍历方式前序遍历根 → 左 → 右voidpreorder(TreeNoderoot){if(rootnull)return;System.out.println(root.val);preorder(root.left);preorder(root.right);}中序遍历左 → 根 → 右voidinorder(TreeNoderoot){if(rootnull)return;inorder(root.left);System.out.println(root.val);inorder(root.right);}后序遍历左 → 右 → 根voidpostorder(TreeNoderoot){if(rootnull)return;postorder(root.left);postorder(root.right);System.out.println(root.val);}层序遍历BFSvoidlevelOrder(TreeNoderoot){QueueTreeNodequeuenewLinkedList();queue.offer(root);while(!queue.isEmpty()){TreeNodenodequeue.poll();System.out.println(node.val);if(node.left!null)queue.offer(node.left);if(node.right!null)queue.offer(node.right);}}5.3 三大核心思想思想一递归 相信它能搞定子树intmaxDepth(TreeNoderoot){if(rootnull)return0;returnMath.max(maxDepth(root.left),maxDepth(root.right))1;}思想二回溯路径问题path.add(root.val);dfs(root.left);path.remove(path.size()-1);思想三分治returnmerge(leftResult,rightResult);5.4 Day 4 必刷题目题目类型难度104. 二叉树的最大深度递归100. 相同的树递归比较101. 对称二叉树递归比较102. 二叉树的层序遍历BFS236. 二叉树的最近公共祖先后序遍历六、Day 5二分查找 回溯 贪心6.1 二分查找二分查找的核心是每次排除一半前提是数组有序。intleft0,rightnums.length-1;while(leftright){intmidleft(right-left)/2;// 防止溢出if(nums[mid]target)returnmid;elseif(nums[mid]target)leftmid1;elserightmid-1;}return-1;记忆口诀左闭右闭左闭右开mid 别溢出。6.2 回溯Backtracking回溯的本质是尝试所有可能不行就撤回。voidbacktrack(路径,选择列表){if(满足结束条件){result.add(路径);return;}for(选择:选择列表){做选择;backtrack(路径,选择列表);撤销选择;}}6.3 贪心Greedy贪心的核心是每一步都选最优不回头。// 例子跳跃游戏intmaxReach0;for(inti0;inums.length;i){if(imaxReach)returnfalse;maxReachMath.max(maxReach,inums[i]);}returntrue;6.4 Day 5 必刷题目题目类型难度33. 搜索旋转排序数组二分704. 二分查找基础46. 全排列回溯78. 子集回溯55. 跳跃游戏贪心七、Day 6动态规划DP动态规划是算法中的核武器掌握它能解决最难的问题。7.1 DP 解题框架定义状态dp[i]表示什么状态转移方程dp[i] f(dp[i-1], dp[i-2], ...)初始化dp[0],dp[1]等于什么遍历顺序从前到后还是从后到前7.2 常见 DP 类型一维 DP// 爬楼梯dp[i] dp[i-1] dp[i-2]int[]dpnewint[n1];dp[0]1;dp[1]1;for(inti2;in;i){dp[i]dp[i-1]dp[i-2];}二维 DP// 最小路径和int[][]dpnewint[m][n];dp[0][0]grid[0][0];for(inti0;im;i){for(intj0;jn;j){dp[i][j]Math.min(dp[i-1][j],dp[i][j-1])grid[i][j];}}7.3 Day 6 必刷题目题目类型难度53. 最大子数组和一维 DP70. 爬楼梯一维 DP198. 打家劫舍一维 DP62. 不同路径二维 DP72. 编辑距离二维 DP八、六天速通计划总结天数内容核心模板Day 1数组 哈希表 双指针遍历、计数、快慢指针、滑动窗口Day 2链表反转、虚拟头、快慢指针Day 3栈/队列/字符串栈模拟、滑动窗口框架Day 4二叉树 DFS/BFS递归、BFS、后序遍历Day 5二分 回溯 贪心二分模板、回溯框架、贪心策略Day 6动态规划DP 四步框架九、常用方法速查9.1 HashMap 常用方法方法说明put(K key, V value)插入键值对get(Object key)根据 key 获取 valuecontainsKey(Object key)判断是否包含 keygetOrDefault(Object key, V defaultValue)获取 value不存在返回默认值computeIfAbsent(K key, Function remappingFunction)key 不存在时创建并返回size()返回元素个数9.2 数组常用操作操作代码遍历for (int i 0; i nums.length; i)长度nums.length复制Arrays.copyOf(nums, length)排序Arrays.sort(nums)查找Arrays.binarySearch(nums, target)9.3 字符串常用操作操作代码长度s.length()获取字符s.charAt(i)截取s.substring(start, end)转数组s.toCharArray()比较s.equals(other)拼接s.concat(other)或s other十、新手避坑指南10.1 Java 泛型不支持基本类型Mapint,intmap;// ❌ 错误MapInteger,Integermap;// ✅ 正确10.2 字符串比较别用 if(s1s2){}// ❌ 比较引用if(s1.equals(s2)){}// ✅ 比较内容10.3 数组越界检查// 正确做法if(i0inums.length){...}10.4 递归必须有终止条件voiddfs(TreeNoderoot){if(rootnull)return;// 终止条件dfs(root.left);dfs(root.right);}结语刷题不是目的而是手段。通过这六天的学习你应该建立起一套完整的算法思维体系看到题目能快速判断该用什么模板写出代码能保证逻辑正确无 Bug。记住几个关键的成功标志能在 5 分钟内默写反转链表代码能在 10 分钟内写出两数之和的哈希解法能在 15 分钟内完成二叉树的层序遍历能独立分析出一道 DP 题的状态转移方程当这些都做到时你已经具备了应对大多数面试的能力。接下来的路还很长但你已经迈出了最关键的一步。算法之路道阻且长行则将至。