
解题思路:
\qquad
时间复杂度要求为O(Log N),可知此题用二分查找解决。
\qquad
二分基本思路是,通过锚定一个中间值mid,把搜索区间一分为二,根据mid与目标值的比较结果,更新下一次搜索区间(左半边或右半边),直至区间大小为1。
\qquad
二分其实是有模版的,而且有两种:一种是从左向右找到第一个
≥
\geq
≥ target 的位置(对应移动l),另一种是从右向左找到第一个
≤
\leq
≤ target的位置(对应移动r)。
\qquad
由于本题中,有序数组中无重复元素,且如果没找到此元素时,返回要插入的位置,可以使用模版一来解决。
\qquad
定义区间的边界l和r初始化为[0, N-1]。要找第一个
≥
t
a
r
g
e
t
\geq target
≥target 的位置,即该位置左边的所有元素均小于target。因此当nums[mid] < target时,更新l = mid+1,否则即nums[mid] >= target时,r = mid。最后的退出条件是l == r,通过不断移动l来保证r是第一个大于或等于target的元素。
\qquad
有一点需要注意:由于l和r的取值范围都在[0, N-1]内,题目存在一中特殊情况,即所有元素小于target时,返回nums.size()需要特殊处理下。
int searchInsert(vector<int>& nums, int target) {
int l = 0, r = nums.size()-1, mid = 0;
if(nums[nums.size()-1] < target) return nums.size();
while(l < r)
{
mid = (l + r) / 2;
if(nums[mid] < target)
{
l = mid + 1;
}
else
{
r = mid;
}
}
return l;
}



















