二分搜索
//非递减数列,[left, right] 闭区间,最后left一定会等于right
while(left < right) {//区间只剩1个元素时终止,此时left=right
int mid = left + ((right - left) >> 1);//防止溢出,没有+1,mid偏左
if(target > nums[mid]) {
left = mid + 1;//因为mid已经偏左,left+1可防止死循环
}
else {//包含“相等”的条件在里面,不单独列出“相等”是因为比较操作会耗时,二分搜索(而不是三分四分)只需一个比较操作
right = mid;
}
}
//nums[right] >= target,right是第一个大于等于target的数
//非递减数列,[left, right] 闭区间,最后left一定会等于right
while(left < right) {//区间只剩1个元素时终止,此时left=right
int mid = left + ((right - left + 1) >> 1);//防止溢出,存在+1,mid偏右
if(target < nums[mid]) {
right = mid - 1;//因为mid已经偏右,right-1可防止死循环
}
else {//包含“相等”的条件在里面,不单独列出“相等”是因为比较操作会耗时,二分搜索(而不是三分四分)只需一个比较操作
left = mid;
}
}
//nums[left] <= target,left是最后一个小于等于target的数