文章目录
1.题目
给定一个排序的整数数组 nums
和一个整数目标值 target
,请在数组中找到 target
,并返回其下标。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
示例 4:
输入: nums = [1,3,5,6], target = 0
输出: 0
示例 5:
输入: nums = [1], target = 0
输出: 0
2.思路
- 如果
nums[mid]
等于目标值,则直接返回mid
,表示找到了目标值的位置。 - 如果
nums[mid]
大于目标值,说明目标值位于左半部分,此时将右边界right
移动到mid - 1
。 - 如果
nums[mid]
小于目标值,说明目标值位于右半部分,此时将左边界left
移动到mid + 1
。
3.代码
c++
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1; // 初始化左右边界
// 使用二分查找
while (left <= right) {
// 计算中间位置,避免直接相加可能导致的溢出
int mid = left + (right - left) / 2;
// 如果中间元素等于目标值,返回该元素的下标
if (nums[mid] == target) {
return mid;
}
// 如果中间元素大于目标值,说明目标值在左半部分
else if (nums[mid] > target) {
right = mid - 1; // 缩小右边界到 mid 左边
}
// 如果中间元素小于目标值,说明目标值在右半部分
else {
left = mid + 1; // 缩小左边界到 mid 右边
}
}
// 如果未找到目标值,返回 left 作为插入位置
// left 指向第一个大于目标值的位置
return left;
}
};