题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5 输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2 输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7 输出: 4
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
为 无重复元素 的 升序 排列数组-104 <= target <= 104
题解
时间复杂度为O(n):
时间复杂度为n的很好考虑,就是依次遍历三种情况:1)找到匹配项返回下标。2)未找到匹配项,且target是数组中最大项,返回最大下标+1(数组长度)。3)未找到匹配项且数组中存在比target大的项,匹配到第一个比target大的数返回其下标。
int searchInsert(int* nums, int numsSize, int target) {
for(int i=0;i<numsSize;i++){
if(nums[i]==target){
return i;
}
if(nums[i]>target){
return i;
}
}
return numsSize;
}
时间复杂度为O(log n):
时间复杂度为O(log n)则是使用二分查找法,设置左右指针(left、right)和中间指针(mid),while判定条件为左指针小于等于右指针。每次比较中间数和target的大小:1)相等返回mid的值。2)target<mid所对应数值,将右指针左移,继续搜索匹配。3)target>mid所对应数值,将左指针右移,继续搜索匹配。最后while循环结束还未匹配,则可以返回numsSize,也可以返回left。
int searchInsert(int* nums, int numsSize, int target) {
int left=0;
int right=numsSize-1;
while(left<=right){
int mid=(left+right)/2;
if(target==nums[mid]){
return mid;
}
if(target<nums[mid]){
right=mid-1;
}
else{
left=mid+1;
}
}
return left;
}