给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
算法思路:其实一看这道题大家应该就都有了解题思路,可以直接一个for循环,找到target,找到就返回下标,没找到就把target插到排序数组中,并返回下标,该解法的时间复杂度为0(n),但题目要求时间复杂度必须为O(logn),所以我们首先想到的就是二分法,需要设置两个指针,每次都从两个指针的中间位置查找,代码如下:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int len=nums.size();
int high=len-1;
int low=0;
while(low<=high){
int mid=low+((high-low)/2);
if(nums[mid]<target)
low=mid+1;
if(nums[mid]>target)
high=mid-1;
if(nums[mid]==target)
return mid;
}
return low;
}
};
最近我在学习哈希算法,所以想用哈希来解决这个问题,我的思路是,先把数组存到哈希中,key存下标,value存值,然后遍历数组,找到target,找到返回key,没找到就 找第一个大于target的数,然后把target存进去,再把大于target的数重新存进去。(这样好像很麻烦,我没有考虑时间复杂度,主要是想学习哈希的用法)
不知道我的这个思路有没有问题,希望大家可以评论补充,可以的话能不能实现我的思路,想看看具体代码,大家一起交流,谢谢谢谢~~