暴力
输入样例很少,直接O(n)遍历就行
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
first,second = -1,-1
meet = False
for i,num in enumerate(nums):
if num==target:
if not meet:
first = i
second = i
meet = True
else:
second = i
return [first,second]
二分
数组已经排好序,用lower_bound找到第一次出现的位置,如果此时位置==n,那么返回-1,-1,否则用upper_bound找大于target的第一个元素,然后返回first,second-1
两次O(logn)级别的算法,最终复杂度还是O(logn)
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
first,second = -1,-1
first = self.lower_bound(nums,target)
if first == len(nums) or nums[first]!=target:
return [-1,-1]
second = self.upper_bound(nums,target) - 1
return [first,second]
def lower_bound(self,nums,target):
left,right = 0,len(nums)
while left<right:
mid = (right+left)//2
if nums[mid] >= target:
right = mid
else:
left = mid+1
return left
def upper_bound(self,nums,target):
left,right = 0,len(nums)
while left<right:
mid = (right+left)//2
if nums[mid] > target:
right = mid
else:
left = mid+1
return left
或者我直接lower_bound一次,然后往后找,不用upper_bound了
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
first = self.lower_bound(nums,target)
if first == len(nums) or nums[first]!=target:
return [-1,-1]
second = first
while second+1 != len(nums) and nums[second+1] == target:
second+=1
return [first,second]
def lower_bound(self,nums,target):
left,right = 0,len(nums)
while left<right:
mid = (right+left)//2
if nums[mid] >= target:
right = mid
else:
left = mid+1
return left