给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。
示例 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
代码:折半查找法
//折半查找法
int searchInsert(int* nums, int numsSize, int target) {
int low=0, high=numsSize-1, mid;
while( low<=high ) //折半查找(查找成功元素下标为mid,查找不成功low>high)
{
mid = (low+high)/2;
if( nums[mid]==target )
return mid;
else if( target<nums[mid] )
high = mid-1;
else
low = mid+1;
}
if( low>high )
return low; //nums[low]为比target大的下一个元素下标,即插入位置
return 0; //满足非常规情况下的返回要求,否则提示错误
}
在原题条件下,将target插入到数组中(前提是数组的空间>原数组元素的数目)
代码:折半查找法+循环后移
//折半查找法
int searchInsert(int* nums, int numsSize, int target) {
int low=0, high=numsSize-1, mid;
int i;
while( low<=high ) //折半查找(查找成功元素下标为mid,查找不成功low=high)
{
mid = (low+high)/2;
if( nums[mid]==target )
return mid;
else if( target<nums[mid] )
high = mid-1;
else
low = mid+1;
}
if( low>high )
{
for( i=numsSize-1; i>high; i-- ) //循环后移,插入target
nums[i+1] = nums[i]; //此时i+1=low
nums[++i] = target;
return i; //此时i==low
}
return 0; //满足非常规情况下的返回要求,否则提示错误
}