⭐今日份题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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(logn)
二分法,简言之就是每次排除掉剩余部分的二分之一的数据。我们需要3个指针:左端指针l、右端指针r和中间指针mid,其中,mid=(l+r)/2。每次通过判断mid与目标数值target的大小来缩小范围,换言之,也就是判断target会出现在哪半部分中。
二分法的思路很简单,而且因为提示中说到数组是无重复元素且升序排序的,那使用二分法就更没有问题了,这道题目唯一困难的点就是在细节处理上,比如插入位置的定位、只有一个元素的情况等等,具体可以看我的代码。
经典的二分题目,初学的同学可以多看几遍掌握一下思路,有问题评论区见哦~
⭐代码
class Solution
{
public:
int searchInsert(vector<int>& nums, int target)
{
int l=0,r=nums.size()-1,mid;
if(l==r)
{
if(target<nums[l]) return 0;
else if(target>nums[l]) return 1;
else return 0;
}
while(r-l>=1)
{
if(r==l+1)
{
if(nums[l]==target) return l;
else if(nums[r]==target) return r;
else if(target<nums[l]&&l!=0) return l-1;
else if(target<nums[l]) return 0;
else if(target>nums[l]&&target<nums[r]) return r;
else if(target>nums[r]) return r+1;
}
else
{
mid=(l+r)/2;
if(nums[mid]<target) l=mid;
else if(nums[mid]>target) r=mid;
else return mid;
}
}
return 0;
}
};
提交结果
我的代码的内存消耗还是不小的,欢迎大家提供更高效的代码,如果过后有更优化的思路我还会继续更新的,大家评论区见!
点赞收藏不迷路⭐~