"""
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/er-fen-cha-zhao-suan-fa-xi-jie-xiang-jie-by-labula/
思路:将nums分成左右两个域,分别进行查找left,right值
二分法查找可以参考33题,只不过需要在nums[mid]=target时,继续进行二分查找
注意:需要考虑出界问题,left在最右边;right在最左边情况
left<=len(nums)-1 and nums[left]=target;返回left;否则返回-1
right>=0 and nums[right]=target;返回right;否则返回-1
注意:分半时需要将指针mid+1,mid-1
"""
class Solution:
def searchRange(self,nums,target):
#特判,nums为空
if len(nums)==0:return [-1,-1]
l=self.left_bound(nums,target)
r=self.right_bound(nums,target)
return [l,r]
#查找左边界
def left_bound(self,nums,target):
left=0
right=len(nums)-1
while left<=right:
mid=(left+right)//2
#找到target,继续向左查找
if nums[mid]==target:
right=mid-1
elif nums[mid]>target:
right=mid-1
elif nums[mid]<target:
left=mid+1
#处理边界问题
if left<=len(nums)-1 and nums[left]==target:
return left
else:return -1
#查找右边界
def right_bound(self,nums,target):
left=0
right=len(nums)-1
while left<=right:
mid=(left+right)//2
#找到target,继续向右查找
if nums[mid]==target:
left=mid+1
elif nums[mid]>target:
right=mid-1
elif nums[mid]<target:
left=mid+1
#处理边界问题
if right>=0 and nums[right]==target:
return right
else:return -1
nums=[5,7,7,8,8,10]
target=6
ret=Solution().searchRange(nums,target)
print(ret)
来源:oschina
链接:https://my.oschina.net/tedzheng/blog/4284145