leetcode【中等】34、在排序数组中查找元素的第一个和最后一个位置

在这里插入图片描述
思路:
要求复杂度nlogn,直接遍历复杂度是n,要用二分查找
注意边界上下取整!

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        if len(nums)==0:
            return [-1,-1]
        l=self.findleft(nums,target)
        if l==-1:
            return [-1,-1]
        r=self.findright(nums,target)
        return [l,r]

    def findleft(self,nums,target):
        left=0
        right=len(nums)-1
        while left<right:
            mid = left + (right - left) // 2#用/2会出现小数
            if nums[mid]<target:
                left=mid+1
            elif nums[mid]==target:#mid是一个目标,mid前可能还有
                right=mid
            else:
                #nums[mid]>target
                right=mid-1
        if nums[left] == target:
            return left
        else:
            return -1

    def findright(self,nums,target):
        left=0
        right=len(nums)-1
        while left<right:
            mid = left + (right - left + 1) // 2
            if nums[mid]>target:
                right=mid-1
            elif nums[mid]==target:#mid是一个目标,mid后可能还有
                left=mid
            else:
                #nums[mid]<target
                left=mid+1
        return left#如果l存在,那r肯定存在

关于二分查找边界问题上下取整

  • right = midleft = mid + 1mid = left + (right - left) / 2;一定是配对出现的;
  • right = mid - 1left = midmid = left + (right - left + 1) /2; 一定是配对出现的。

猜你喜欢

转载自blog.csdn.net/qq_40707462/article/details/112434875