实现思路
使用二分查找,利用二分查找循环代码的框架
具体可参照【刷题基础知识】-二分查找
与普通的二分查找不一样的点主要在于这里面不仅要判断是否存在元素,如果找到了该元素要直接返回该位置,如果没有找到要返回该元素正确应该在的位置。
情况可以主要分为两大类
第一类:
找到了该元素,直接返回该元素的下标
第二类:
没有找到该元素,需要再分两种情况
(1)target比终止状态大
在正常的比较中,这个target最后一步是和1比较可以发现target比1大
此时begin=0,end=0,按照算法begin=mid+1=1
可以看到其实这个begin就是最后放置元素的位置
注意这种情况下的边界,例:7在正常逻辑下最后一个比较的元素为6,7能放置的位置为nums.size(),为了通用的情况可以写成min(begin,nums.size())
(2)target比终止状态小
分析同上情况,所以通用的情况可以写成max(end,0)
实现代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int begin=0,end=nums.size()-1;
int mid;
while(begin<=end){
int mid=(begin+end)/2;
if(target==nums[mid]) return mid;
else if(target<nums[mid]){
end=mid-1;
}
else if(target>nums[mid]){
begin=mid+1;
}
}
if(target<nums[mid]){
return max(end,0);
}
else{
return min(begin,int(nums.size()));
}
}
};
另一种代码
提交结果
时间复杂度O(log(n))
测试技巧
由于本题属于二分查找,所以在测试的时候可以使用循环遍历值就可以测试出边界条件