每次写二分无非就是两个问题,1.while()内填写left<=right还是left<right 2.当sums[mid]>target时,right取mid-1还是mid
可以分为两个区间的情况讨论,一个是 [left,right], 一个是 [left,right),当我们取左闭右闭区间时,while内填left<=right,因为left == right在左闭又闭区间是有效的,right取mid-1,因为我们已经确定 nums[mid] 不可能等于 target,当我们取左闭右开区间时,while内填写left<right,因为在左闭右开区间中left == right是不存在的, right取mid,因为我们不对nums[right]作判断
代码如下:
方法1:
int search(int* nums, int numsSize, int target) { int left = 0; int right = numsSize-1; while(left <= right){ int mid = (left+right)/2; if(nums[mid] < target){ left = mid+1; }else if(nums[mid] > target){ right = mid-1; }else{ return mid; } } return -1; }
方法二:
int search(int* nums, int numsSize, int target) {
int left = 0;
int right = numsSize; // 注意右边是开区间,所以nums[right]取不到,所以不需要-1,不然少一个数据
while(left < right){
int mid = (left+right)/2;
if(nums[mid] < target){
left = mid+1;
}else if(nums[mid] > target){
right = mid; // mid不需要-1,因为我们不取nums[right]作判断
}else{
return mid;
}
}
return -1;
}
欢迎各位大佬指正!