我的思路就是二分法(虽然最后落实的时候,写成了递归形式),虽然效率不怎么高,但是我第一个不看解析的写的中等难度的题.T^T.
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
left, right = 0, len(nums)
self.first, self.last = -1, -1
if right == 0 :
return [-1, -1]
def binarySearch(left, right, flag): # flag 表示有没有找到基准位置, -1没找到,现在找基准,1找到了基准,现在找开始位置,2表示找到了基准,现在找结束位置
print('left,right:',left, right)
print('first:', self.first)
print('last:', self.last)
if left > right : return
mid = (left + right) // 2
if nums[mid] == target: # 找到了基准
print('mid:', mid)
if flag == -1: # 第一次遇到target,左右两边都没办法不查询
self.first, self.last = mid, mid
binarySearch(left, mid-1, 1) # 查找左边部分,找开始位置
binarySearch(mid+1, right, 2) # 查找右边部分,找结束位置
elif flag == 1: # 遇到过target,现在找开始的位置,当前位置又是target,只要再往左边查找就行
self.first = mid
binarySearch(left, mid-1, 1)
elif flag == 2: # 遇到过target,现在找结束的位置,当前位置又是target,只要再往右边查找就行
self.last = mid
binarySearch(mid+1, right, 2)
elif nums[mid] < target:
binarySearch(mid+1, right, flag) # check right
else:
binarySearch(left, mid-1, flag) # check left
binarySearch(left, right-1, -1)
return [self.first, self.last]
看了参考答案,用的两次二分,分别差左边界和右边界。好像效率也没提升多少…窃喜.jpg
参考链接: