给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
我用的是折半查找,用的比较戳,折半查找不多说。重点是最后几句,例如[1,3,5,6] target1=7、target=0,这两种种情况我写的这般查找找完了都没有,所以要加上开头几句判断,如果target比最大值还大和比最小值还小或相同时。
第二个代码块是参考了官方的方法,引入多一个变量,开始的时候就赋给它numSize用于解决target比最大值还大的情况,之后循环判断中赋mid,即可不需把相等的情况另外再写。
int searchInsert(int* nums, int numsSize, int target){
int left=0;
int right=numsSize-1;
int mid=0;
return left;
while(right-left>1)
{
mid=(right+left)/2;
if(target<nums[mid])
{
right=mid;
}
if(target>nums[mid])
{
left=mid;
}
if(target==nums[mid])
{
return mid;
}
}
if(target>nums[right]) //这里是解决target比数组的最大值大和比最小值小的情况
return right+1;
else if(target<=nums[left])
return right; //若target在数组中,必定是放在right处
}
int searchInsert(int* nums, int numsSize, int target){
int left=0;
int right=numsSize-1;
int mid=0;
int ans=numsSize;
while(left<=right)
{
mid=((right-left)/2)+left;
if(target<=nums[mid])
{
ans=mid;
right=mid-1;
}
else
left=mid+1;
}
return ans;
}
```