题目:
题解:
读题发现要想实现本题的要求,需要使用二分查找的泛型查找。二分查找的泛型查找又分为~01~型和~10~型。这两种查找方式使用起来的主要区别在于对左右区间的更新方式。
~01~型:(左闭右闭)
mid=(r+l)>>1;
当mid指向对象为1时,r=mid,当mid指向对象为0时,l=mid+1;
~10~型:(左闭右闭)
mid=(r+l+1)>>1;
当mid指向对象为1时,l=mid,当mid指向对象为0时,l=mid-1;
本题使用~01~型查找可以符合要求,但是本题有一个小细节,当插入的值比所有元素都要大时,应该插入到序列最后一个元素的后面,所以查找区间右边界的下标应该比数组右区间下标加一才能满足所有情况。
int searchInsert(vector<int>& nums, int target) {
int r=nums.size(),l=0,mid;
while(r>l){
mid=(r+l)>>1;
if(nums[mid]>=target)r=mid;
else l=mid+1;
}
return l;
}