考察知识点:二分

题目分析:

由于该序列是升序的,我们每次找到由左边界和右边界确定的中点。当该点比目标值大或等于目标值时,将右边界缩小到中间这个点;当该点比目标值小时,将左边界向右移动到中间的后一个点。

下方给出的代码中l和r总是会在指向同一个数时停止。当目标值存在或者目标值不存在但应插入序列中间某个位置时,结果就是l的值;当目标值不存在需要插入到末尾时,由于r在目标值的左侧,所以需要r + 1才是最终结果。

所用编程语言:C++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param labels int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int searchInsert(vector<int>& labels, int target) {
        // write code here
        int size = labels.size();
        int l = 0, r = size - 1;
        if (labels[r] < target) return r + 1;
        while (l < r) {
            int mid = l + r >> 1;
            if (labels[mid] >= target) r = mid;
            else l = mid + 1;
        }
        return l;
    }
};