添加链接描述
class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:n=len(nums)i,j=0,n-1if not n:return [-1,-1]while i<=j:mid=i+(j-i)//2if target<nums[mid]:j=mid-1elif target>nums[mid]:i=mid +1else:x,y=mid,midwhile x-1>=0 and nums[x-1]==target:x=x-1while y+1<=n-1 and nums[y+1]==target:y=y+1return [x,y]return [-1,-1]
思路:
- 使用二分查找
- 找到对应位置后,向左向右寻找相同值
时间复杂度大小:
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)
解法二:把解法一的while拿出来分开写
class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:def searchLeft(nums, target):# 左边界需要满足两个条件:# 1. 他的值为target# 2. 他的左边元素小于他,或者他的下标为0left, right = 0, len(nums)-1while left <= right:mid = (right-left)//2 + leftif nums[mid] == target:if mid == 0 or nums[mid-1] < target:return midelse:right = mid - 1elif nums[mid] > target:right = mid - 1else:left = mid + 1return -1def searchRight(nums, target):# 右边界需要满足两个条件:# 1. 他的值为target# 2. 他的右边元素大于他,或者他的下标为len(nums)-1left, right = 0, len(nums)-1while left <= right:mid = (right-left)//2 + leftif nums[mid] == target:if mid == len(nums)-1 or nums[mid+1] > target:return midelse:left = mid + 1elif nums[mid] > target:right = mid - 1else:left = mid + 1return -1return [searchLeft(nums, target), searchRight(nums, target)]