二分搜索算法
- 看似简单,写对很难
- 变形很多
- 在面试中常用来考察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
- 如果发现目标数在左边,那么就递归从左半边进行查找
时间复杂度为: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;
}
核心(重点)
- 确定搜索的范围和区间
- 取中间的数判断是否满足条件:核心判断条件是啥
- 如果不满足条件,判断应该往哪个半边继续进行搜索
变形
找确定的边界
- 边界分为上边界与下边界,有时也称为左边界和右边界
- 确定的边界,指边界的数值等于要找的目标数
查找下边界的代码
查找上边界
找模糊的边界
二分搜索可以用来查找一些模糊的边界
模糊的边界,即边界的值不等于目标的值,而是大于或小于目标的值
- 在数组中查找某个数