找回密码
 立即注册
首页 业界区 业界 二分查找刷题总结

二分查找刷题总结

趣侮 2025-11-23 22:40:00
推荐使用闭区间的方式去做二分查找的题目
如果数量比较少,那么建议使用顺序遍历的方式
因此二分结束时一定有: i指向首个大于 target 的元素,j指向首个小于 target 的元素。易得当数组不包含 target 时,插入索引为
162. 寻找峰值

寻找最大值,这个也可以理解,嗯
大的一侧为什么一定有峰值?注意题目条件,在题目描述中出现了 nums[-1] = nums[n] = -∞,这就代表着 只要数组中存在一个元素比相邻元素大,那么沿着它一定可以找到一个峰值
沿着大的方向走,肯定会存在一个峰值
  1. class Solution {
  2.     public int findPeakElement(int[] nums) {
  3.         int l = 0, r = nums.length - 1;
  4.         while (l < r) {
  5.             int mid = l + ((r - l) >> 1);
  6.             if (nums[mid] < nums[mid + 1]) {
  7.                 l = mid + 1;
  8.             } else {
  9.                 r = mid;
  10.             }
  11.         }
  12.         return l;
  13.     }
  14. }
复制代码
33. 搜索旋转排序数组

我们将数组从中间分开成左右两部分的时候,一定有一部分的数组是有序的
当前 mid 为分割位置分割出来的两个部分 [l, mid] 和 [mid + 1, r] 哪个部分是有序的,并根据有序的那个部分确定我们该如何改变二分查找的上下界,因为我们能够根据有序的那部分判断出 target 在不在这个部分:

  • 如果 [l, mid - 1] 是有序数组,且 target 的大小满足 [nums[l],nums[mid]),则我们应该将搜索范围缩小至 [l, mid - 1],否则在 [mid + 1, r] 中寻找。
  • 如果 [mid, r] 是有序数组,且 target 的大小满足 [nums[mid+1],nums[r]],则我们应该将搜索范围缩小至 [mid + 1, r],否则在 [l, mid - 1] 中寻找。
[code]public int search(int[] nums, int target) {    int lo = 0, hi = nums.length - 1, mid = 0;    while (lo = nums[lo]) { // left到mid是有序数据            if (target >= nums[lo] && target < nums[mid]) {                hi = mid - 1;            } else {                lo = mid + 1;            }        } else { // mid --> right是有序数组            if (target > nums[mid] && target

相关推荐

您需要登录后才可以回帖 登录 | 立即注册