题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 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
解答
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 获取数组的长度
n = len(nums)
# 初始化二分查找的左右边界
left, right = 0, n - 1
# 使用二分查找来查找目标值
while left <= right:
# 计算中间元素的索引
mid = (left + right) // 2
# 如果找到目标值,直接返回其索引
if nums[mid] == target:
return mid
# 如果目标值大于中间值,说明目标值位于右侧区域,更新左边界
if nums[mid] < target:
left = mid + 1
# 如果目标值小于中间值,说明目标值位于左侧区域,更新右边界
else:
right = mid - 1
# 如果目标值不存在,返回目标值应该插入的位置
# 此时 left 指向第一个大于 target 的位置,或者如果 target 最大,left 指向数组末尾
return left
显然这道题目也是搜索排序数组的变形,具体的解答方法也已经在之前的博客中有所介绍。
-
初始化边界:
left
和right
分别指向数组的最左边和最右边,开始时的查找区间是整个数组。
-
二分查找:
while left <= right
:继续查找直到left
和right
重合。mid = (left + right) // 2
:计算中间位置。if nums[mid] == target
:如果当前中间元素nums[mid]
等于目标值target
,直接返回其索引mid
。
-
更新查找范围:
- 如果
nums[mid] < target
,说明目标值应该在右边,更新left = mid + 1
,继续在右侧查找。 - 如果
nums[mid] > target
,说明目标值应该在左边,更新right = mid - 1
,继续在左侧查找。
- 如果
-
返回插入位置:
- 当循环结束时,说明数组中没有目标值,此时
left
会指向目标值应该插入的位置。这个位置要么是数组中第一个大于目标值的索引,要么是数组末尾(当目标值大于所有元素时)。
- 当循环结束时,说明数组中没有目标值,此时
感谢阅读,希望对你有所帮助~