大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

这道题目考察的是在有序数组中查找目标值或者插入位置,要求时间复杂度为 O(log n)。

题目解答方法的文字分析

给定一个升序排列的数组 labels,表示牛群中牛的标签值。

我们的任务是找到给定目标标签值 target 在牛群中的位置,如果目标标签值在牛群中存在,则返回其位置;如果目标标签值在牛群中不存在,则返回它按顺序插入的位置。

为了实现时间复杂度为 O(log n) 的算法解决此问题,我们可以使用二分法来查找目标值或者插入位置。

具体步骤如下:

  1. 初始化指针 left 指向数组的第一个元素,指针 right 指向数组的最后一个元素。
  2. 在数组中查找目标值或者插入位置,直到找到目标值或者 left 大于 right。在查找过程中,计算中间元素 labels[mid] 和目标值 target 的关系:如果 labels[mid] == target,说明目标值在牛群中存在,直接返回 mid 即可。如果 labels[mid] > target,说明目标值在 mid 的左侧,将指针 right 更新为 mid - 1。如果 labels[mid] < target,说明目标值在 mid 的右侧,将指针 left 更新为 mid + 1。
  3. 如果 left 大于 right,则说明目标值在牛群中不存在,返回 left,即为插入位置。

本题解析所用的编程语言 (C++)

本题解析所用的编程语言是 C++。

完整且正确的编程代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param labels int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int searchInsert(vector<int>& labels, int target) {
        int left = 0;
        int right = labels.size() - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;

            if (labels[mid] == target) {
                return mid;
            } else if (labels[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        // 返回位置
        return left;
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!