给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
示例 4:
输入: nums = [1,3,5,6], target = 0
输出: 0
示例 5:
输入: nums = [1], target = 0
输出: 0
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 为无重复元素的升序排列数组
-104 <= target <= 104
要保证时间复杂度为 O(log n) ,则用二分法。
c++实现
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
if(nums.size()==0)
{ return 0; }
int left=0;
int right=nums.size()-1;
while(left<right)
{
int mid=(left+right)/2;
if(nums[mid]==target)
{
return mid; //找到目标值则返回其索引
}
/*当nums[mid]≠target时,寻找第一个大于等于target的元素
(这个元素的索引就是target的插入位置)。right之后的元素都比target大,
left之后的元素都比target小。当left和right指针相邻或者相等的时候,
此时target要么插在left指针上,要么插在left指针的后一个位置上。*/
else if(nums[mid]>target)
{ right=mid; }
else
{ left=mid+1; }
}
return nums[left]>=target?left:left+1;
}
};
java实现
class Solution {
public int searchInsert(int[] nums, int target) {
if(nums==null||nums.length==0)
{ return 0; }
int left=0;
int right=nums.length-1;
while(left<right)
{
int mid=(left+right)/2;
if(nums[mid]==target)
{ return mid; }
else if(nums[mid]>target)
{ right=mid; }
else
{ left=mid+1; ,}
}
return nums[left]>=target?left:left+1;
}
}
python实现
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
if nums==None or len(nums)==0:
return 0
left=0
right=len(nums)-1
while(left<right):
mid=left+(right-left)//2
if nums[mid]==target:
return mid #找到目标值则返回其索引
#当nums[mid]≠target时,寻找第一个大于等于target的元素(这个元素的索引就是target的插入位置)。right之后的元素都比target大,left之后的元素都比target小。当left和right指针相邻或者相等的时候,此时target要么插在left指针上,要么插在left指针的后一个位置上。
elif nums[mid]>target:
right=mid
else:
left=mid+1
return left if nums[left]>=target else left+1
若题目对于时间复杂度无要求,则逐个遍历的方法也可行,此时时间复杂度为O(n)。
且以力扣上的运行时间和内存消耗来看,也是可以接受的。
c++实现
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
if(nums.size()==0)
{ return 0; }
for(int i=0;i<nums.size();i++)
{
if(nums[i]>=target)
{ return i; }
}
return nums.size();
}
};
java实现
class Solution {
public int searchInsert(int[] nums, int target) {
if(nums==null||nums.length==0)
{ return 0; }
for(int i=0;i<nums.length;i++)
{
if(nums[i]>=target)
{ return i; }
}
return nums.length;
}
}
python实现
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
if nums==None or len(nums)==0:
return 0
for i,num in enumerate(nums): #enumerate()函数返回两个值,第一个为索引,第二个为值
#所以for循环中每个i=index,num=value
if num>=target:
return i
return len(nums)