题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目解析
该题我们可以采用二分查找的方式,我们可以把数组分为,小于target的一边儿和大于等于target的一边儿。
当mid=left+(right-left)下标所对应的数大于等于target的时候,说明target落在了mid的左边,因此应该改变right=mid;
当mid=left+(right-left)下标所对应的数小于target的时候,说明target落在了mid的右边,此时应改变left=mid+1;
最后考虑一下如果target大于该数组的最后一个元素的时候应该返回的下标。
代码
class Solution
{
public:
int searchInsert(vector<int>& nums, int target)
{
int n=nums.size();
int left = 0,right=n-1;
// 设target的下标为index
// 小于target的[left,index-1]
// 区间分为大于等于target的 [index,right]
while(left<right)
{
int mid=left+(right-left)/2;
// 该if条件成立说明mid落在了[index,right]
// 因此应该改变右边界
if(nums[mid]>=target)
right=mid;
// 该else条件成立说明mid落在了[left,index-1]
// 因此应该改变左边界
else
left=mid+1;
}
if(nums[left]<target) return right+1;
return left;
}
};