题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5 输出: 2
示例 2:
输入: [1,3,5,6], 2 输出: 1
示例 3:
输入: [1,3,5,6], 7 输出: 4
示例 4:
输入: [1,3,5,6], 0 输出: 0
题解
二分查找,先设定左侧下标 left 和右侧下标 right,再计算中间下标 mid;
每次根据 nums[mid] 和 target 之间的大小进行判断,
- 相等则直接返回下标,
- nums[mid] < target 则 left 右移,
- nums[mid] > target 则 right 左移。
查找结束如果没有相等值则返回 数组长度(right + 1),该值为插入位置。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n = nums.size();
int left = 0;
int right = n - 1; // 定义target在左闭右闭的区间里,[left, right]
while (left <= right) { // 当left==right,区间[left, right]依然有效
int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
if (nums[middle] > target) {
right = middle - 1; // target 在左区间,所以[left, middle - 1]
} else if (nums[middle] < target) {
left = middle + 1; // target 在右区间,所以[middle + 1, right]
} else { // nums[middle] == target
return middle;
}
}
return right + 1;
}
};
复杂度分析
- 时间复杂度: O(logn)
- 空间都杂毒: O(1)