二分查找万能3种模版

 

 

嗯 在看了labuladong哥之前写的一篇文章,结合最近遇到的4种题型,总结一下四种二分查找的模板吧。 链接地址:https://mp.weixin.qq.com/s/uA2suoVykENmCQcKFMOSuQ

我是结合大神的模板然后总结出自己的4个屡试不爽的模板吧。给速成的人吃快餐 死记硬背也能完全get解法

 

这是一个万能模板。

def binarySearch(nums:list, target:int) {
    int left = 0, right = ...;

    while(...) {
        mid = (right + left) // 2;
        if nums[mid] == target:
            ...
        else if nums[mid] < target) :
            left = ...
        else if nums[mid] > target):
            right = ...
        return ...

其中。。。是需要注意会出错的地方了。

1.基本二分查找,寻找一个数

基本二分查找一个数的模板。

def binarySearch(nums:list, target:int) {
    int left = 0, right = len(nums)-1;

    while(left<=right) {
        mid = (right + left) // 2;
        if nums[mid] == target:
            return mid
        else if nums[mid] < target) :
            left = mid+1
        else if nums[mid] > target):
            right = mid-1
        return -1

 2.寻找数的左侧边界,意思是返回<target的最大index

def binarySearch(nums:list, target:int) {
    int left = 0, right = len(nums);

    while(left<right) {
        mid = (right + left)//2;
        if nums[mid] <target:
            left = mid+1
        else:
            right = mid
        return left

3.寻找数的右侧边界,返回<=target的最大index。 

def binarySearch(nums:list, target:int) {
    int left = 0, right = len(nums);

    while(left<right) {
        mid = (right + left)//2;
        if nums[mid] <=target:
            left = mid+1
        else:
            right = mid
        return left-1

4.寻找数的右侧位,返回>target的最小index 

这个与3类似,区别就是最后返回的是left,为了防止target超过数组最大元素导致left=size出现越界,所以在最开始先判断target是否大于等于数组中最大的元素,如果大于等于就直接return -1

def binarySearch(nums:list, target:int) {
    int left = 0, right = len(nums);
    if target>= nums[right-1]:
        return -1
    while(left<right) {
        mid = (right + left)//2;
        if nums[mid] <=target:
            left = mid+1
        else:
            right = mid
        return left-1

总结:

基本二分查找就不说了。

主要说后三种边界定位 小于的最大index。小于等于的最大index 大于的最小index

首先三种的搜索区间right都为len(nums),也就决定了循环判断都是left<right

三种判断right的收紧都为mid left都为mid+1,对于第一种情况 mid<target是一种情况,对于第二第三种 mid<=target是一种情况

第三种最后返回left 同时为了防止越界首先先加入判断。

  

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值