大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目考察的是在有序数组中查找目标值或者插入位置,要求时间复杂度为 O(log n)。
题目解答方法的文字分析
给定一个升序排列的数组 labels,表示牛群中牛的标签值。
我们的任务是找到给定目标标签值 target 在牛群中的位置,如果目标标签值在牛群中存在,则返回其位置;如果目标标签值在牛群中不存在,则返回它按顺序插入的位置。
为了实现时间复杂度为 O(log n) 的算法解决此问题,我们可以使用二分法来查找目标值或者插入位置。
具体步骤如下:
- 初始化指针 left指向数组的第一个元素,指针right指向数组的最后一个元素。
- 在数组中查找目标值或者插入位置,直到找到目标值或者 left 大于 right。在查找过程中,计算中间元素 labels[mid]和目标值target的关系:如果 labels[mid] == target,说明目标值在牛群中存在,直接返回 mid 即可。如果 labels[mid] > target,说明目标值在 mid 的左侧,将指针 right 更新为 mid - 1。如果 labels[mid] < target,说明目标值在 mid 的右侧,将指针 left 更新为 mid + 1。
- 如果 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;
    }
};

 京公网安备 11010502036488号
京公网安备 11010502036488号