Java LeetCode 热门算法精讲
本文整理了一系列在 LeetCode 上高频出现的算法题目核心解题思路,涵盖了排序、查找、链表、动态规划、字符串处理等多个领域。每个算法都配有精炼的步骤解析和核心思想总结。
一、核心排序算法
1. 快速排序
快速排序采用分治策略,通过选取基准值将数组分为两部分,递归排序后得到整体有序序列。
- 步骤解析:
- 选择基准值:从数组中选择一个元素作为基准(pivot),常见选择为首元素或中间元素。
- 分区操作:重新排列数组,使所有小于基准的元素位于其左侧,大于基准的位于其右侧。
- 递归排序:对基准左右两侧的子数组递归地应用快速排序。
- 合并结果:由于是在原数组上进行原地排序,递归结束后数组即完全有序,无需额外合并。
- 核心要点:基准值的选择直接影响算法性能,理想情况下应选择中位数作为基准。
2. 堆排序
堆排序利用堆数据结构进行选择排序,通过构建最大堆并反复交换堆顶与末尾元素来实现排序。
- 步骤解析:
- 构建最大堆:从最后一个非叶子节点开始,自底向上进行下沉操作,确保每个节点都大于或等于其子节点。
- 交换堆顶元素:将堆顶元素(最大值)与当前堆的最后一个元素交换。
- 重新调整堆:缩小堆的范围,并对新的堆顶元素执行下沉操作,以恢复最大堆性质。
- 重复过程:重复交换与调整步骤,直到堆的大小缩减为 1。
- 核心要点:堆排序不是稳定的排序算法,时间复杂度为 O(n log n),特别适合处理大数据集。
3. 归并排序
归并排序是典型的分治算法,它将数组不断拆分至最小单元,再通过合并有序子数组来完成整体排序。
- 步骤解析:
- 分解数组:递归地将当前数组一分为二,直到每个子数组只包含一个元素。
- 合并排序:将两个已排序的子数组合并成一个新的有序数组。
- 递归实现:分解与合并的过程通过递归调用完成。
- 辅助空间:合并过程需要额外的临时数组来存储中间结果。
- 核心要点:归并排序是一种稳定的排序算法,时间复杂度 O(n log n),适合数据量大且要求稳定性的场景。
二、经典查找算法
4. 二分查找
二分查找是一种在有序数组中快速定位目标值的高效算法。
- 步骤解析:
- 初始化边界:设定查找范围的起始索引
low = 0和结束索引high = 数组长度 - 1。 - 计算中间索引:在每次循环中计算中间索引
mid = low + (high - low) / 2。 - 比较中间元素:将
arr[mid]与目标值target进行比较。 - 调整搜索范围:若
arr[mid] < target,则在右侧区间[mid+1, high]继续查找;若arr[mid] > target,则在左侧区间[low, mid-1]查找。
- 初始化边界:设定查找范围的起始索引


