题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
link
binary search模板
要注意区间!!
下面模板是[l, r)
区间
while(l < r) {
int mid = l + r >> 1; // (l + r) / 2
if (A[mid] > target)
r = mid;
else if (A[mid] < target)
l = mid + 1;
else
return mid;
}
题解
看到复杂度:
O
(
l
o
g
n
)
O(logn)
O(logn),以及sorted array,很容易想到用二分。
利用模板
note:
- template区间是
[l, r)
,所以code中r = nums.size()
- 如果不在数组中,需要插入,因此每次二分时,如果是移动后面的指针,需要更新结果的
index
.
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int l = 0, r = nums.size();
int res = nums.size();
while (l < r) {
int mid = (l + r) >> 1;
if (nums[mid] > target) {
r = mid;
res = mid;
}
else if (nums[mid] < target)
l = mid + 1;
else {
res = mid;
break;
}
}
return res;
}
};