二分查找,也称折半查找,是一种效率较高的查找算法。其思路是将要查找的区间不断缩小,直到找到目标元素或确定目标元素不存在。
具体实现过程如下:
1. 确定要查找的区间[left, right],初始时为整个数组或列表;
2. 计算区间中间位置mid,取值为(left + right) // 2;
3. 判断目标元素target与中间元素arr[mid]的大小关系:
- 若target == arr[mid],则找到目标元素,返回mid;
- 若target > arr[mid],说明目标元素在[mid + 1, right]区间内,将left更新为mid + 1,继续执行步骤2;
- 若target < arr[mid],说明目标元素在[left, mid - 1]区间内,将right更新为mid - 1,继续执行步骤2;
4. 若区间[left, right]缩小为0,仍未找到目标元素,说明目标元素不存在,返回-1。
下面用Java展示代码:
首先使用一个if语句判断当target不在区间范围内,没有查询到,则返回-1。
然后定义一个left和一个right 。
使用while循环的时候一定要注意区间问题,在二分查找中有两种解决方法,其中有分区间为[left,right]和[left,right),这两种方法分别是左闭右闭和左闭右开,而两种方法的区别就在于判断left是否等于right,但在左闭右闭的情况下就必须要left=right,左闭右开就只需要left<right就可以了。定义一个mid,其中>>1在Java中表示除以2的意思,向左偏移了2^1,如果像向右偏移,则用<<1,然后使用if语句进行判断,如果找找到对应元素1,则返回mid,如果nums[mid]>target,则范围会在[left,mid-1],如果nums[mid]<target,则范围会在[mid+1,right]。
最后代码如下:
class Solution {
public int search(int[] nums, int target) {
if(target<nums[0] && target>nums[nums.length-1]){
return -1;
}
int left = 0;
int right = nums.length - 1;
while(left<=right){
int mid = left +((right-left) >>1 );
if(nums[mid]==target)
return mid;
else if(nums[mid]<target)
left = mid + 1;
else if(nums[mid]>target)
right = mid -1;
}
return -1;
}
}
文中图片来自@代码随想录