LeetCode—搜索插入位置
1.题目描述
2.二分法搜索
基本思路:(1)根据题目时间复杂度O(logn)的要求,考虑使用二分法进行查找。(2)若元素大于整个数组,则返回nums.size()+1;否则,返回数组第一个大于等于目标值的元素下标。
算法的时间复杂度为O(logn),空间复杂度为O(1)。
版本一:使用递归
class Solution {
public:
int get(vector<int>&nums, int target, int lo, int hi) {
if(lo==hi) {
if(nums[lo]>=target) {
return lo;
} else {
return lo+1;
}
}
int mid = (lo+hi)/2;
if(target>nums[mid]) {
return get(nums,target,mid+1,hi);
} else if(target==nums[mid]) {
return mid;
}
return get(nums,target,lo,mid);
}
int searchInsert(vector<int>& nums, int target) {
return get(nums,target,0,nums.size()-1);
}
};
版本二:循环遍历
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int lo = 0;
int hi = nums.size()-1;
int ans = nums.size();
while(lo<=hi) {
int mid = ((hi-lo)>>1)+lo;
if(nums[mid]>=target) {
ans = mid;
hi = mid-1;
} else {
lo = mid+1;
}
}
return ans;
}
};