35. 搜索插入位置
这道题目跟704.二分查找很像,只是那道题在没有找到时返回-1,然而本题则要求返回其应该插入(保持升序)的位置。
解题思路:
设n=nums.size()
手动模拟一下,返回插入的位置一共有种情况:
target
比nums所有的元素都要小,那么应该插入在0的位置,此时的[left,right]
是[0,-1]
。target
比nums所有的元素都要大,插入的位置应该是n,此时的[left,right]
是[n,n-1]
。target
插入在数组中时,当left+1=right
时,插入的位置就是left+1
,但是由于在计算mid
时是整数的除法,所以跳出循环之后,left
已经+1了。- 从上所述,我们只需要
return left
即可。
class Solution {
public:
int searchInsert(vector<int>& nums, int target)
{
int left=0,right=nums.size()-1,mid=0;
while(left<=right)
{
mid=(right-left)/2+left;//其实直接(left+right)/2就可以,这么写是为了防止溢出
if(target>nums[mid])left=mid+1;
else if(target<nums[mid])right=mid-1;
else return mid;
}
return left; //其实也包含了return mid的情况。
}
};