本道题对应于我们算法专栏二分查找理论中的查找某元素左边界问题类型的原型。
我们分别采用的在理论详述中介绍的左闭右闭区间搜索法、左闭右开区间搜索法解答。
左闭右闭区间搜索:
int searchInsert(vector<int>& nums, int target) {
return left_bound(nums,target);
}
int left_bound(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) left=mid+1;
if(nums[mid]>target) right=mid-1;
else if(nums[mid]==target) right=mid-1;
}
return left;//left改成right也可以,因为while结束时lfet=right
}
左闭右开区间搜索:
int searchInsert(vector<int>& nums, int target) {
return left_bound(nums,target);
}
int left_bound(vector<int>& nums, int target){
int left=0,right=nums.size();
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]<target) left=mid+1;
if(nums[mid]>target) right=mid;
else if(nums[mid]==target) right=mid;
}
return left;//left改成right也可以,因为while结束时lfet=right
}
注意到我们两种形式代码里,while循环结束后都并没有判断left是否越界、left对应位置是否是target,why?
因为我们题目要求了,若没有找到,则返回插入位置,而我们算法结束while之后的left指向的位置
就是我们待插入的位置。
关于左闭右闭、左闭右开区间搜索法;二分查找寻找左边界、二分查找寻找右边界问题详述请看我的专栏:算法之二分查找理论(三种问题类型、两种算法形式)