一、题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
二、思路
1、找target
开始和结束位置,其实我们要找的就是数组中第一个等于 target的位置
和第一个大于 target 的位置减一。
2、为了代码的复用,我们定义searchInsert( target)
表示在 nums 数组中搜索插入target
的位置。
🐖 本题有重复值,二分查找代码略有改动。
三、代码
class Solution:
def searchRange(self, nums, target):
def searchInsert(target):
left = 0
right = len(nums) - 1
while left <= right: # 候选区有值
mid = (left + right) // 2
if nums[mid] >= target: # target有重复值,我们要向左移动,取到第一个target位置
right = mid - 1
else:
left = mid + 1
return left
begin = searchInsert(target)
if begin == len(nums) or nums[begin] != target: # 如果target是最大的,或者 nums为空;或者nums中找不到target值
return [-1, -1]
return [begin, searchInsert(target + 1) - 1]
四、复杂度分析
时间复杂度:O(logn) ,其中 n为数组的长度。二分查找的时间复杂度为 O(logn),一共会执行两次,因此总时间复杂度为 O(logn)。
空间复杂度:O(1)。只需要常数空间存放若干变量。