//如果没有重复元素两种方式等价,并且l和r都相等,如果有重复元素,则第一种为左边界,第二种为右边界都是可以取到的 //循环结束条件均为l==r voidbsearch_1(int l, int r)//寻找左边界 区间左闭右开 { while (l < r) { int mid = l + r >> 1; if (nums[mid]>=target) r = mid;//找左边界往左边缩 else l = mid + 1; } l1 = l, r1 = r; }
voidbsearch_2(int l, int r)//寻找右边界 区间左开右闭 { while (l < r) { int mid = l + r + 1 >> 1; // +1 原因在于:通过 (l + r) / 2 计算mid的值,结果是向下取整的。 在区间内只有两个元素的时,r的值可以用l + 1代替,因此mid = (l + r) / 2 = (l + l + 1) / 2 = l。 这个时候更新l = mid,l的值更新后依旧为l。 if (nums[mid]<=target) l = mid;//找右边界往右边缩 else r = mid - 1; } l2 = l, r2 = r; }
vector<int> nums = { -1,0,3,5,5,5,5,5,9,12 }; int target = 5;
int l1, r1, l2, r2;
voidbsearch_1(int l, int r)//寻找左边界 左闭右开 { while (l < r) { int mid = l + r >> 1; if (nums[mid]>=target) r = mid; else l = mid + 1; } l1 = l, r1 = r; }
voidbsearch_2(int l, int r)//寻找右边界 左开右闭 { while (l < r) { int mid = l + r + 1 >> 1; if (nums[mid]<=target) l = mid; else r = mid - 1; } l2 = l, r2 = r; }