Java LeetCode 热门算法精讲
本文整理了 Java 语言在 LeetCode 上的高频算法题目,涵盖排序(快速、堆、归并)、查找(二分、中位数)、数据结构(链表、树)、算法思想(动态规划、贪心、回溯、DFS/BFS)及数组字符串技巧。通过步骤解析与核心要点总结,帮助读者掌握常见解题思路与优化方案,适用于面试准备与算法能力提升。

本文整理了 Java 语言在 LeetCode 上的高频算法题目,涵盖排序(快速、堆、归并)、查找(二分、中位数)、数据结构(链表、树)、算法思想(动态规划、贪心、回溯、DFS/BFS)及数组字符串技巧。通过步骤解析与核心要点总结,帮助读者掌握常见解题思路与优化方案,适用于面试准备与算法能力提升。

本文整理了一系列在 LeetCode 上高频出现的算法题目核心解题思路,涵盖了排序、查找、链表、动态规划、字符串处理等多个领域。每个算法都配有精炼的步骤解析和核心思想总结。
快速排序采用分治策略,通过选取基准值将数组分为两部分,递归排序后得到整体有序序列。
堆排序利用堆数据结构进行选择排序,通过构建最大堆并反复交换堆顶与末尾元素来实现排序。
归并排序是典型的分治算法,它将数组不断拆分至最小单元,再通过合并有序子数组来完成整体排序。
二分查找是一种在有序数组中快速定位目标值的高效算法。
low = 0 和结束索引 high = 数组长度 - 1。mid = low + (high - low) / 2。arr[mid] 与目标值 target 进行比较。arr[mid] < target,则在右侧区间 [mid+1, high] 继续查找;若 arr[mid] > target,则在左侧区间 [low, mid-1] 查找。low > high)。对于无序数组,可以通过多种算法高效地找到中位数。
n/2 大的元素。在旋转后的有序数组中搜索特定元素,需要结合二分查找并考虑数组的旋转特性。
链表反转是数据结构中的经典问题,通过就地修改指针方向实现反转。
prev(前一个节点,初始为 null)、curr(当前节点,初始为头节点)、next(后一个节点)。curr.next 指向 prev,实现指针方向反转。prev 移动到 curr,curr 移动到 next,继续遍历。prev 将成为新的头节点。使用快慢指针技巧可以高效地检测链表中是否存在环。
slow 每次移动一步,fast 每次移动两步。fast 与 slow 相遇(指向同一节点),则链表存在环。fast 及其 next 是否为空,避免空指针异常。实现带随机指针的链表的深拷贝,关键在于正确处理随机指针的指向。
动态规划是解决优化问题的重要方法,通过递推逐步构建最优解,斐波那契数列是其典型入门案例。
dp[i] 表示第 i 个斐波那契数的值。dp[i] = dp[i-1] + dp[i-2]。dp[0] = 0,dp[1] = 1。dp[2] 到 dp[n] 的值。dp[n] 即为所求的第 n 个斐波那契数。贪心算法在解决会议室预定时,通过每次选择结束时间最早且不与已选会议重叠的会议,来安排最多的会议。
八皇后问题是回溯算法的经典应用,通过尝试每一种可能的布局来寻找所有合法的解决方案。
DFS 是一种用于遍历或搜索树或图的算法,它会尽可能深地探索树的分支。
BFS 是一种按层遍历树或图的算法,常用于寻找最短路径。
利用集合(如 HashSet)的特性可以轻松实现数组去重。
LinkedHashSet 代替 HashSet。通过哈希集合可以快速找出两个数组的交集。
摩尔投票法是一种空间复杂度为 O(1) 的算法,用于找出数组中出现次数超过一半的元素。
candidate,并初始化计数 count = 1。candidate,则 count++;否则 count--。count 变为 0,则将下一个元素设为新的 candidate,并将 count 重置为 1。candidate 即为所求的众数候选。candidate 的出现次数是否真的超过一半。通过反转数组的特定部分,可以高效地实现数组旋转。
k = k % n,因为旋转整数倍长度等于没转。k 个元素和剩余元素,并分别对这两部分进行反转。k 步的效果。使用双指针法可以高效地判断一个字符串是否为回文串。
left 指向字符串开头,right 指向字符串末尾。left < right 时,循环比较 s[left] 和 s[right] 是否相等。如果不相等,则不是回文串。如果相等,则 left++,right--,继续比较。利用回溯法可以遍历并生成一个字符串的所有可能排列。
used)或在同一层递归中跳过已使用过的相同字符,以避免生成重复排列。滑动窗口法是解决最小覆盖子串问题的经典方法。
T 中每个字符的需求量,以及当前窗口内各字符的拥有量。T 的所有字符。此时,尝试移动左指针缩小窗口,以找到满足条件的最小子串。快乐数的判断涉及到循环检测,可以通过快慢指针技巧高效解决。
slow 每次计算一次变换,fast 每次计算两次变换。slow 或 fast 变为 1,则该数是快乐数。fast 与 slow 相遇(得到相同的结果,且该结果不为 1),则说明进入了循环,该数不是快乐数。LCS 是经典的二维动态规划问题,用于衡量两个序列的相似度。
dp[i][j],表示字符串 text1[0..i-1] 和 text2[0..j-1] 的最长公共子序列长度。dp[0][j] 和 dp[i][0] 均为 0,表示空串与任何字符串的 LCS 长度为 0。text1[i-1] == text2[j-1],则 dp[i][j] = dp[i-1][j-1] + 1;否则 dp[i][j] = max(dp[i-1][j], dp[i][j-1])。dp[m][n] 开始,根据状态转移的方向回溯,可以构造出其中一个最长公共子序列。dp[i] 只依赖于 dp[i-1],可以通过滚动数组将空间复杂度优化到 O(min(m, n))。利用二叉搜索树中序遍历结果为递增序列的特性,可以高效找到第 k 小的元素。
找出数组中第 k 大的元素有多种解法,适用于不同场景。
n-k 的元素。时间复杂度 O(n log n)。n-k 的关系,只在包含目标的一侧递归查找。平均时间复杂度 O(n),最坏 O(n²)。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online