二分法搜索(4)-在排序数组中查找元素的第一个和最后一个位置

67 阅读1分钟

题目

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

思路

很明显的二分法,求左边界值其实就是常规的求确切值问题(找到有序素组中为target的元素),不同之处在于,此题中 不是递增序列,而是单调不递减序列,这就意味着可能存在一个区间的值都是等于target的,而题目要求的就是求这个可能区间的边界下标。 求左边界很容易,按照套路求解就行。而右边界则稍稍有点不同,但是大体一致,只是比较条件跟求左边界相反,需要注意的求出的结果最终要-1,具体原因是因为(left+right)//2(left+right) // 2是向下取整的,能否想明白这点?

代码

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        if not nums:
            return -1,-1
        # 求左边界值
        left = 0
        n = len(nums)
        right = n
        while left < right:
            mid = (left+right) // 2
            if nums[mid] < target:
                left = mid + 1
            else:
                right = mid
        r1 = left
        if r1 >= n or nums[r1] != target:
            return -1, -1
        # 求右边界值
        left = 0
        right = n
        while left < right:
            mid = (left+right) // 2
            if nums[mid] > target:
                right = mid
            else:
                left = mid + 1
        r2 = right - 1

        return r1,r2