二分查找思路简单,复杂点在边界的处理上
思路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个元素时会陷入死循环,需要注意