二分查找思路简单,复杂点在边界的处理上
思路1:在循环体中查找元素
void search(int *nums, int left, int right, int target){
// 在[left,right]区间里进行查找
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]==target){
return mid;
}
else if(nums[mid]<target){
right=mid-1; // 下一轮搜索区间[left, mid-1]
}
else{
left=mid+1; // [mid+1, right]
}
}
return -1;
}
这种写法是在循环体内部进行目标元素的查找。
思路2:循环体中逼近目标元素
// 选择中位数时选择上/下取整
void search(int *nums, int left, int right, int target){
// 在[left,right]区间里进行查找
while(left<right){
int mid=left+(right-left)/2; //向下取整
if(nums[mid]<target){
left=mid+1; // [mid+1, right]
}
else{
right=mid; // 下一轮搜索区间[left, mid]
}
}
if(nums[left]==target)return left;
else return -1;
}
void search(int *nums, int left, int right, int target){
// 在[left,right]区间里进行查找
while(left<right){
int mid=left+(right-left+1)/2; //向上取整
if(nums[mid]<target){
right=mid-1; // 下一轮搜索区间[left, mid-1]
}
else{
left=mid; // [mid+1, right]
}
}
if(nums[left]==target)return left;
else return -1;
}
思路二中 循环体退出时,判断left下标元素是否符合目标元素
在使用思路二时,在取mid=left+(right-left)/2 向下取整时, 如果后续left=mid的话,当只有2个元素时会陷入死循环,需要注意