Leetcode 解题模版 - Binary Search

适用场景

一种针对有序区间内的O(logN)的搜索方式,最常见用于已经排好序的Array

解题模版

ini 复制代码
public int binarySearch(int[] arr, int k) {
  int l = 0, r = arr.length - 1;
  while(l <= r) {
    //int mid = (l + r) / 2;   normally avoid since it might overflow for int
    int mid = l + (r - l) / 2;
    if(arr[mid] == k) {
      return mid; 
    } else if (arr[mid] > k) {
      r = mid - 1;
    } else {
      l = mid + 1;
    }
  }
  return -1;  
}

三大模版:

  1. 找一个准确值:

<1> 循环条件: l <= r

<2> 缩减搜索空间:

l = mid + 1

r = mid - 1

  1. 找一个模糊值(比4大的数字, first occurrence of 2)

<1> 循环条件:l < r

<2> 缩减搜索空间:

l = mid

r = mid - 1

or

l = mid + 1

r = mid

  1. 万用型

<1> 循环条件:l < r - 1

<2> 缩减搜索空间:

l = mid

r = mid

变换场景

找一个模糊值

e.g. the first occurance of 2

ini 复制代码
public int binarySearch(int[] arr, int k) {
  int l = 0, r = arr.length - 1;
  while(l < r) {
    int mid = l + (r - l) / 2;
    if(arr[mid] < k) {
      l = mid + 1;
    } else {
      r = mid;
    }
  }
  return l;
}

e.g. last occurrence of 2

ini 复制代码
public int binarySearch(int[] arr, int k) {
  int l = 0, r = arr.length - 1;
  while(l < r) {
    int mid = l + (r - l + 1) / 2;
    if(arr[mid] > k) {
      r = mid - 1;
    } else {
      l = mid;
    }
  }
  return r;
}

万用型 (closest to 2)

<1> 循环条件:l < r - 1

<2> 缩减搜索空间:

l = mid

r = mid

ini 复制代码
public int binarySearch(int[] arr, int k) {
  int l = 0, r = arr.length - 1;
  while(l < r - 1) {
    int mid = l + (r - l) / 2;
    if(arr[mid] < k) 
      l = mid;
    else
      r = mid;
  }

  //upon determine the l/r, compare the value
  if(arr[r] < k) {
    return r;
  } else if(arr[l] > k) {
    return l;
  } else {
    return k - arr[l] > arr[r] - k ? r : l;
  }
}
相关推荐
dragoooon344 分钟前
[优选算法专题八.分治-归并 ——NO.46~48 归并排序 、数组中的逆序对、计算右侧小于当前元素的个数]
数据结构·算法·排序算法·分治
CoderYanger4 分钟前
优选算法-队列+宽搜(BFS):72.二叉树的最大宽度
java·开发语言·算法·leetcode·职场和发展·宽度优先·1024程序员节
招摇的一半月亮8 分钟前
P2242 公路维修问题
数据结构·c++·算法
赵大海17 分钟前
黑马《Java架构师实战训练营 (含完整资料)》
java
不带刺仙人球25 分钟前
list.stream().collect例子
java·list·dubbo
星轨初途28 分钟前
数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析
c语言·开发语言·数据结构·经验分享·笔记·算法·排序算法
人类发明了工具43 分钟前
【机器人-激光雷达】点云时间运动补偿
算法·机器人
Carve_the_Code1 小时前
分布式订单系统:订单号编码设计实战
java·后端
Home1 小时前
23种设计模式之代理模式(结构型模式二)
java·后端
程序员西西1 小时前
详细介绍Spring Boot中用到的JSON序列化技术?
java·后端