1. 题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-insert-position
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.代码如下
int searchInsert(int* nums, int numsSize, int target){
if (nums == NULL || numsSize <= 0)
{
return -1;
}
int left = 0;
int right = numsSize -1;
int mid = 0;
int pos = 0;
while (left < right)
{
mid = (left+right)/2;
if (nums[mid] == target)
{
return mid;
}
else if (nums[mid] < target)
{
left = mid+1;
}
else
{
right = mid-1;
}
}
if (target > nums[left])
{
pos = left+1;
}
else
{
pos = left;
}
return pos;
}
3.解题思路
如果元素存在,用二分法是一定可以查找到的。
若元素不存在的时候,最终跳出二分法的while循环后,left和right是相等的,此时,若target大于nums[left]则,target的插入位置在left(right)的右边,否则就插在left(right)的左边,在left的右边的话pos=left+1,若在left的左边的话,是将left及其后面的元素右移一个位置给target腾出位置,所以pos不是等于left-1,而是left.