1. 题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O ( l o g n ) O(log n) O(logn) 的算法。
示例 1:
输入:
n
u
m
s
=
[
1
,
3
,
5
,
6
]
,
t
a
r
g
e
t
=
5
nums = [1,3,5,6], target = 5
nums=[1,3,5,6],target=5
输出:
2
2
2
示例 2:
输入:
n
u
m
s
=
[
1
,
3
,
5
,
6
]
,
t
a
r
g
e
t
=
2
nums = [1,3,5,6], target = 2
nums=[1,3,5,6],target=2
输出:
1
1
1
示例 3:
输入:
n
u
m
s
=
[
1
,
3
,
5
,
6
]
,
t
a
r
g
e
t
=
7
nums = [1,3,5,6], target = 7
nums=[1,3,5,6],target=7
输出:
4
4
4
提示:
- 1 < = n u m s . l e n g t h < = 1 0 4 1 <= nums.length <= 10^4 1<=nums.length<=104
- − 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^4 <= nums[i] <= 10^4 −104<=nums[i]<=104
- n u m s nums nums 为 无重复元素 的 升序 排列数组
- − 1 0 4 < = t a r g e t < = 1 0 4 -10^4 <= target <= 10^4 −104<=target<=104
2. 思路及代码实现详解(Python)
2.1 二分查找
考虑这个插入的位置 p o s pos pos,它成立的条件为:
n u m s [ p o s − 1 ] < t a r g e t ≤ n u m s [ p o s ] nums[pos−1]<target≤nums[pos] nums[pos−1]<target≤nums[pos]
其中 n u m s nums nums 代表排序数组。由于如果存在这个目标值,我们返回的索引也是 p o s pos pos,因此我们可以将两个条件合并得出最后的目标:「在一个有序数组中找第一个大于等于 t a r g e t target target 的下标」。如下代码,不断地更新查找的左右索引边界,只要有边界大于等于 t a r g e t target target 就更新 a n s ans ans,最后保证 a n s ans ans 取到的是大于等于 t a r g e t target target 的最小值,即是该值位置。
class Solution:
def searchInsert(self, nums, target):
n = len(nums)
left, right, ans = 0, n - 1, n
while (left <= right):
mid = ((right - left)//2) + left
if (target <= nums[mid]):
ans = mid
right = mid - 1
else:
left = mid + 1
return ans
执行用时:47 ms
消耗内存:16.95 MB
题解来源:力扣官方题解