美文网首页
二分查找

二分查找

作者: wncbbnk | 来源:发表于2022-11-04 18:17 被阅读0次

1. 口诀

1.1 类型1 左侧查找型

对于从小到大排序的数组,查找第一个>= target 的元素
比如

index: 0 1 2 3 4 5 6
value: 1 2 3 3 5 6 7

查找第一个大于等于3的数字,mid=3, 满足条件, 但是答案是2,相当于在满足条件的情况下,继续向左侧查找
需要的解,向左侧查找。

left=0
// 如果返回len(array),表示没有找到,如果一定有解,那么设置为len(array)-1
right=len(array)
for left<right {
  mid=(left+right)/2
  if array[mid]>=target {
    // mid位置的元素满足条件,mid有可能是解,也有可能解在左侧,所以right=mid
    right=mid
  }else{
    // mid位置的元素小于target,那么解一定在右侧(且一定不包含mid),因此调节左边界
    left=mid+1
  }
  return right
}

1.2 类型2 右侧查找型

对于从小到大排序的数组,查找最后一个<= target 的元素
比如

index: 0 1 2 3 4 5 6
value: 1 2 2 3 3 6 7

查找最后一个小于等于3的数字,mid=3, 满足条件, 但是答案是4,相当于在满足条件的情况下,继续向右侧查找
需要的解,向右侧查找。

// 如果返回-1,表示没有找到,如果一定有解,可以设置为0
left=-1
right=len(array)-1
for left<right {
  mid=(left+right+1)/2
  if array[mid]<=target {
    // mid位置的元素满足条件,mid有可能是解,也有可能解在右侧,所以left=mid
    left=mid
  }else{
    // mid位置的元素大于target,那么解一定在左侧(且一定不包含mid),因此调节左边界
    right=mid-1
  }
  return right
}

2. 口诀

2.1 类型1 左侧查找型

对于从小到大排序的数组,查找第一个>= target 的元素
比如

index: 0 1 2 3 4 5 6
value: 1 2 3 3 5 6 7

查找第一个大于等于3的数字,mid=3, 满足条件, 但是答案是2,相当于在满足条件的情况下,继续向左侧查找
需要的解,向左侧查找。

left=0
right=len(array)-1
for left<right {
  mid=(left+right)/2
  if array[mid]>=target {
    // mid位置的元素满足条件,mid有可能是解,也有可能解在左侧,所以right=mid
    right=mid
  }else{
    // mid位置的元素小于target,那么解一定在右侧(且一定不包含mid),因此调节左边界
    left=mid+1
  }
  if array[right]!=target{
    return -1
  }
  return right
}

2.2 类型2 右侧查找型

对于从小到大排序的数组,查找最后一个<= target 的元素
比如

index: 0 1 2 3 4 5 6
value: 1 2 2 3 3 6 7

查找最后一个小于等于3的数字,mid=3, 满足条件, 但是答案是4,相当于在满足条件的情况下,继续向右侧查找
需要的解,向右侧查找。

left=0
right=len(array)-1
for left<right {
  mid=(left+right+1)/2
  if array[mid]<=target {
    // mid位置的元素满足条件,mid有可能是解,也有可能解在右侧,所以left=mid
    left=mid
  }else{
    // mid位置的元素大于target,那么解一定在左侧(且一定不包含mid),因此调节左边界
    right=mid-1
  }
  if array[right]!=target{
    return -1
  }
  return right
}

3. 例题

153. 寻找旋转排序数组中的最小值
154. 寻找旋转排序数组中的最小值 II
34. 在排序数组中查找元素的第一个和最后一个位置

相关文章

网友评论

      本文标题:二分查找

      本文链接:https://www.haomeiwen.com/subject/foxutdtx.html