题解
由于是排序不重复数组,本题实质上为二分查找
二分法
-
初始化左指针 l = 0 l=0 l=0,右指针 r = n − 1 r=n-1 r=n−1,其中 n n n为数组长度。 r e s = − 1 res=-1 res=−1,用来保存 t a r g e t target target不在数组中的情况。
-
当 l < = r l<=r l<=r时,执行循环:(注意!,因为初始化 r = n − 1 r=n-1 r=n−1,所以搜索区间为闭合区间 [ l , r ] [l,r] [l,r],因此结束条件为 l > r l>r l>r,所以是 l < = r l<=r l<=r)
- 定义 m i d = ( l + r ) / / 2 mid=(l+r)//2 mid=(l+r)//2,当 n u m s [ m i d ] = = t a r g e t nums[mid]==target nums[mid]==target时,返回 m i d mid mid,。
- 当 n u m s [ m i d ] > t a r g e t nums[mid]>target nums[mid]>target时,说明 t a r g e t target target在搜索区间 [ l , m i d − 1 ] [l,mid-1] [l,mid−1]中,令 r = m i d − 1 r=mid-1 r=mid−1。。
- 当 n u m s [ m i d ] < t a r g e t nums[mid]<target nums[mid]<target时,说明 t a r g e t target target在搜索区间 [ m i d + 1 , r ] [mid+1,r] [mid+1,r]中,令 l = m i d + 1 l=mid+1 l=mid+1。
-
此时,返回 l l l,即为插入位置,三种情况:
- [ 2 , 3 , 5 , 6 , 7 ] , t a r g e t = 4 [2,3,5,6,7],target=4 [2,3,5,6,7],target=4,此时 l = 2 l=2 l=2,满足。
- [ 2 , 3 , 4 , 5 , 6 ] , t a r g e t = 0 [2,3,4,5,6],target=0 [2,3,4,5,6],target=0,此时 l = 0 l=0 l=0,满足。
- [ 2 , 3 , 4 , 5 , 6 ] , t a r g e t = 7 [2,3,4,5,6],target=7 [2,3,4,5,6],target=7,此时 l = 6 l=6 l=6,满足。
复杂度分析
- 时间复杂度: O ( log n ) O(\log n) O(logn)
- 空间复杂度: O ( 1 ) O(1) O(1)
Python
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
if(not nums):
return 0
n=len(nums)
l=0
r=n-1
res=-1
while(l<=r):
mid=(l+r)//2
if(nums[mid]==target):
return mid
elif(nums[mid]>target):
r=mid-1
else:
l=mid+1
res=l
return res