二分搜索

//非递减数列,[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的数
原文地址:https://www.cnblogs.com/season-peng/p/6713495.html