解题思路:
\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;
}