大家好,我是开车的阿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; } };