二分查找
力扣题目链接:https://leetcode.cn/problems/binary-search/
这道题目的前提是数组为有序数组,同时题目还强调了数组中无重复元素。
写二分法,区间的定义一般为两种,左闭右闭[left,right]和左闭右开[left,right)
第一种写法:定义target是在一个左闭右闭的一个区间里[left,right],所以有以下两点
-
while(left <= right) 中的符号必须是 <= 因为在这个区间里,left == right是有意义的
-
if(nums[middle] > target) 那么重新定义左区间时 右边界 right = middle -1 ,因为当前这个nums[middle]一定不是target那么接下来要查找的左边界结束下标位置就是middle-1
Java代码如下:
class Solution{
public int search(int[] nums,int target){
int left = 0, right = nums.length-1;
while(left <= right){
int mid = (right - left)/2 + left;
if(nums[mid] == target){
return mid;
}else if(nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
}
第二种写法:定义target是在一个左闭右开的一个区间里[left,right),所以有以下三点
-
初始赋值 right = nums.length;
-
while(left <= right) 中的符号必须是 <,因为在区间[left,right)中 left ==right 是无意义的
-
if(nums[middle] > target) 那么重新定义左区间时 右边界 right = middle ,当前这个nums[middle]一定不是target,由于接下来要查找的左边界是左闭右开的,所以right更新为middle,因为下一个查询区间不会去比较nums[middle]
Java代码如下:
class Solution{
public int search(int[] nums,int target){
int left = 0, right = nums.length;
while(left < right){
int mid = (right - left)/2 + left;
if(nums[mid] == target){
return mid;
}else if(nums[mid] > target){
right = mid;
}else{
left = mid + 1;
}
}
return -1;
}
}