leetcode704--二分查找(二分查找的两种写法)
leetcode704–二分查找
二分查找第一种写法
定义target在一个左闭右闭的区间里,[left,right]
区间的定义决定了二分法的代码应该怎么写,因为定义target在[left,right]中,所以:
while(left<=right)
要是有<=,因为left==right是有意义的。if (nums[middle] > target)
right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
class Solution {
public int search(int[] nums, int target) {
int left=0,right=nums.length-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]>target){
right=mid-1;
}else if(nums[mid]<target){
left=mid+1;
}else{
return mid;
}
}
return -1;
}
}
二分查找第二种写法
如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。
有如下两点:
while (left < right)
,这里使用 < ,因为left == right在区间[left, right)是没有意义的if (nums[middle] > target)
right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
class Solution {
public int search(int[] nums, int target) {
int left=0,right=nums.length;
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]>target){
right=mid;
}else if(nums[mid]<target){
left=mid+1;
}else{
return mid;
}
}
return -1;
}
}