数据结构与算法刷题之【二分查找】篇
<p>汇总二分查找相关的数据结构与算法刷题笔记,讲解二分边界与循环不变量等细节,涵盖缺失数字、搜索插入位置等经典题型并给出Java实现与复杂度分析。</p>
<p>汇总二分查找相关的数据结构与算法刷题笔记,讲解二分边界与循环不变量等细节,涵盖缺失数字、搜索插入位置等经典题型并给出Java实现与复杂度分析。</p>
<p>汇总双指针相关的数据结构与算法刷题笔记,讲解快慢指针、左右指针与对撞指针的使用场景,涵盖回文判断、去重、区间等经典题型并给出Java实现与复杂度分析。</p>
<p>讲解JavaScript数组的定义、访问、遍历与类型检测,梳理push、pop、splice、slice、join、concat、reverse等常用方法,并介绍二维数组、深浅克隆及map、some、fill等高级用法。</p>
<p>本文讲解 LeetCode 第 162 题「寻找峰值」,在可能含多个峰值的数组中返回任一峰值索引。利用 nums[-1]=nums[n]=-∞ 的性质,通过比较 nums[mid] 与 nums[mid+1] 收缩区间进行二分,达到 O(log n) 时间复杂度,并附最大值解法与 Java 代码。</p>
<p>本文讲解 LeetCode 第 198 题「打家劫舍」,在不能偷相邻两间房的约束下求最高金额。定义 dp(i) 表示前 i 间房可偷的最高金额,递推式 dp(i)=max(dp(i-1), dp(i-2)+nums[i]),时间复杂度 O(n),并附 Java 实现。</p>
<p>本文讲解 LeetCode 第 2300 题「咒语和药水的成功对数」,统计每个咒语与药水乘积大于等于 success 的组合数。先对药水排序,再对每个咒语二分查找边界位置得到成功数量,时间复杂度 O(n log n),附 Java 代码。</p>
<p>本文讲解 LeetCode 第 746 题「使用最小花费爬楼梯」,每次可爬一或两阶并支付对应费用,求到达顶部的最小花费。定义 dp(i) 表示到达第 i 阶的最小费用,递推式 dp(i)=min(dp(i-1),dp(i-2))+cost[i],时间复杂度 O(n)。</p>
<p>本文讲解 LeetCode 第 875 题「爱吃香蕉的珂珂」,在 h 小时内吃完所有香蕉的最小速度。对速度进行二分,check 函数按堆累加所需小时数,并给出缩小左右边界的优化技巧,时间复杂度 O(n log n),附 Java 代码。</p>
<p>汇总数组相关的数据结构与算法刷题笔记,涵盖二分查找、移除元素、螺旋矩阵等经典题型,讲解双指针、滑动窗口与原地操作技巧,并给出Java题解与复杂度分析。</p>
<p>本文讲解 LeetCode 第 448 题「找到所有数组中消失的数字」,找出 [1,n] 范围内未出现在数组中的数字。给出哈希表记录与原地数组替换两种解法,后者通过给对应下标加 n 打标记,将空间复杂度优化到 O(1)。</p>
<p>本文讲解 LeetCode 第 121 题「买卖股票的最佳时机」,要求一次买入卖出获取最大利润。通过一次遍历不断更新历史最低价,并在非最低点时计算当天卖出利润与最大利润比较,实现 O(n) 时间、O(1) 空间的 Java 解法。</p>
<p>本文讲解 LeetCode 第 53 题「最大子序和」,分别给出贪心与动态规划两种解法。贪心通过判断当前和是否为正决定是否累加,动规则利用 f(i)=max(f(i-1)+nums[i], nums[i]) 递推,均达到 O(n) 时间复杂度与 O(1) 空间复杂度。</p>
<p>本文记录 LeetCode 383 赎金信的判断方法,要求赎金信字符串能由杂志字符串中的字符构成。文章给出题目描述与调试代码,利用仅含小写字母的特点,用长度 26 的数组统计杂志字符次数,再遍历赎金信逐个抵消完成校验。</p>
<p>本文记录 LeetCode 1 两数之和的解题过程,要求在数组中找出和为目标值的两个下标。文章给出题目描述与调试代码,先介绍 O(n²) 的暴力解法,再重点讲解利用 HashMap 边遍历边查找补数的 O(n) 哈希解法以及双指针优化。</p>
<p>本文记录 LeetCode 349 两个数组的交集的解法,要求结果元素唯一且不考虑输出顺序。文章给出题目描述与调试代码,介绍借助 Set 集合去重的思路:先把第一个数组存入 set1,再遍历第二个数组判断元素是否命中,从而得到交集。</p>