leetcode之二分查找

二分搜索算法

  • 看似简单,写对很难
  • 变形很多
  • 在面试中常用来考察code能力

定义

二分搜索也叫折半搜索,是一种在有序数组中查找某一特定元素的搜索算法

核心: 有序 数组

运用前提

  • 数组必须是排好序的
  • 输入并不一定是数组,也可能是在给定一个区间的起始和终止位置

优点

二分搜索也叫对数搜索,其时间复杂度为O(lgn),是一种非常高效的搜索

缺点

要求待查找的数组或区间是排好序的

当输入的数组或区间是有序的,且不会常变动,要求从中找出一个满足条件的元素,采用二分搜索

解题思路

递归

优点是简洁

缺点是执行消耗大

int binarySearch(int[] nums,int target,int low,int high){
    if(low>high){
        return -1;
    }
    
    int middle = low+(high-low)/2;
    
    if(target<nums[middler]){
        return binarySearch(nums,target,low,middle-1);
    }else{
        return binarySearch(nums,target,middle+1,high);
    }
       
}

递归的写法

  • 二分搜索函数的定义中,不仅要指定数组nums和查找数target,还要指定查找区间的起点low和终点位置high
  • 为了避免无限循环,开始时要判断一下:如果起点位置大于终点位置,表明这是一个非法区间;或者说,已尝试了所有的搜索区间还是没有找到结果,返回-1
  • 接下来,取正中间的那个树的下标middler
  • 判断一下正中间的那个树是不是要找到目标数target,,如果是,就返回下标middle
  • 如果发现目标数在左边,那么就递归从左半边进行查找

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qx111eJh-1585483028536)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1585480088661.png)]

时间复杂度为:O(LOGN)

非递归

int binarySearch(int[] nums,int target,int low,int high){
    
 while(low<=high){
  
     int middle = low+(high-low)/2;
     
     if(nums[middle]==target){
         return middle;
     }
     
     if(target<nums[middle]){
         hish=midle-1;
     }else{
         low=middle+1;
     }
     
 }
    return -1;
}

核心(重点)

  • 确定搜索的范围和区间
  • 取中间的数判断是否满足条件:核心判断条件是啥
  • 如果不满足条件,判断应该往哪个半边继续进行搜索

变形

找确定的边界

  • 边界分为上边界与下边界,有时也称为左边界和右边界
  • 确定的边界,指边界的数值等于要找的目标数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XHy1xTjV-1585483028537)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1585480493155.png)]

在这里插入图片描述

查找下边界的代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xfqnD2uq-1585483028539)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1585480626928.png)]

查找上边界

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBMMAvXr-1585483028539)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1585480659127.png)]

找模糊的边界

二分搜索可以用来查找一些模糊的边界

模糊的边界,即边界的值不等于目标的值,而是大于或小于目标的值

  • 在数组中查找某个数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-brwKboyb-1585483028541)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1585480803461.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJ8AtkhH-1585483028541)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1585480820336.png)]

旋转过排序数组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AlssXt2h-1585483028542)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1585481012997.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SoMwkQNE-1585483028543)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1585481056682.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值