二分查找边界问题

    技术2022-07-20  84

    二分查找思路简单,复杂点在边界的处理上

    思路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个元素时会陷入死循环,需要注意

    Processed: 0.008, SQL: 10