二分枚举满足条件的最小值,即二分求下界,找第一个满足条件的下标
while (left < right) { ll mid = (left + right) >> 1; if (check(mid)) { right = mid; } else { left = mid + 1; } }
如果mid满足条件则right = mid,不满足条件则left = mid + 1
二分枚举满足条件的最大值,即二分求上界,找最后一个满足条件的下标
while(left < right) { int mid = (left + right + 1) >> 1; if(check(mid)) { left = mid; } else { right = mid - 1; } }
如果mid满足条件则left = mid,不满足条件则right = mid - 1
mid = (left + right + 1) >> 1 避免当left = right - 1 时,更新left = mid 等价于 left = left 导致的死循环