在写二分查找时经常会有许多疑惑,比如left<=right还是left<right呢。
我们定义target在一个左闭右闭的区间内。[left,right]那么left=right是有意义的。
并且如果nums[middle]大于target,那么搜索范围右下标right为middle-1。因为是左闭右闭的区间,nums[middle]一定不是target。
但是,我们定义target在一个左闭右开的区间内。[left,right)那么left=right是没有意义的。
并且如果nums[middle]大于target,那么搜索范围右下标right为middle。因为是左闭右开的区间,因为不会比较nums[middle]。
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let left = 0;
let right = nums.length-1;
while(left<=right){
let mid = Math.floor((right+left)/2)
if(nums[mid]>target){
right = mid-1
}else if(nums[mid]<target){
left = mid +1
}else{ //nums[mid] = target
return mid
}
}
return -1
};