题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
题解 python3
# 复杂度O(log n)的方法,用二分无疑了
# 两次二分,第一次查找最左等于target的下标,第二次查找第一个大于target的下标,为了方便,增加flag参数区分是第一次还是第二次
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
def binarySearch(nums, target, flag):
left, right = 0, len(nums)-1
index = len(nums)
while(left <= right):
mid = (left + right) // 2
if((flag==1 and nums[mid]>=target) or (flag==2 and nums[mid]>target)):
right = mid - 1
index = mid
else:
left = mid + 1
return index
index_1 = binarySearch(nums, target, 1)
index_2 = binarySearch(nums, target, 2) - 1
if index_1 <= index_2 and index_2 < len(nums) and nums[index_1]==target and nums[index_2]==target:
return [index_1, index_2]
return [-1,-1]