题目要求要查找一个数字,并且如果目标元素不在数组中返回他应该插入的位置,题目提示数组为无重复元素的升序排列数组,显然,这正好符合二分查找的要求,查找元素很简单就套二分模板就可以,但是插入怎么办?,
举个例子
比如我们要在 1 3 5 6查找数字2,并插入位置,我们可以利用二分查找
我们可以找到中间元素为3,但是继续找2,
![]()
我们这时候就没有2,但2要插入的位置在3的位置,也就是说我们要将2插入到3的位置上也就是下标为1的位置上,但是如果执行上一步就再也找不到要插入的位置,所以我们只需要找到第一个大于等于目标元素即可,如果中间元素正好等于目标元素,那就返回目标元素下标,如果大于目标元素,此位置是目标元素要插入的位置,但是还有一点,如果没有在数组中找到且数组中没有他要插入的位置,那一定是它大于数组中的所有元素,那就插入到最后元素的后面,也就是下标为数组大小,所以我们可以定义一个ans为数组大小,如果没有在数组中查找到,我们就插入到数组中最后一个元素的下一个位置。
int searchInsert(int* nums, int numsSize, int target){
int left =0;
int right = numsSize-1;
int ans =numsSize;//(1)
while(left<=right){//(2)
int mid =(right-left)/2+left;
if(nums[mid]>=target){//(3)
ans =mid;
right =mid-1;
}
else{
left=mid+1;
}
}
return ans;//(4)
}
1):为了如果查找目标元素不在数组里且大于数组中的元素,那肯定就插入到下标为数组大小的位置
2):采用左闭右闭
3):如果中间元素正好等于目标元素,那就返回目标元素下标,如果大于目标元素,此位置是目标元素要插入的位置
4):如果没有在数组中找到且数组中没有他要插入的位置,那一定是它大于数组中的所有元素,那就插入到最后元素的后面,也就是下标为数组大小