LeetCode 34 | 在排序数组中查找元素的第一个和最后一个位置

喜你入骨 提交于 2020-08-13 02:08:05
"""
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)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!