Skip to content

二分查找搜索左右边界.md

这一方法最主要的就是对于相等条件的处理,对于查找左边界,当相等时,将右边界缩小,对于查找右边界,当相等时,将左边界增大。

此外,要对边界进行处理,当左边界超出数组范围时,返回-1,当右边界超出数组范围时,返回-1。

对于下面闭区间的写法,结束条件不是l=r,所以判断是否等于target的时候,要分别判断l和r是否等于target。

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        def searchLeft(arr, target):
            l = 0
            r = len(arr) - 1
            while l <= r:
                mid = (l + r) // 2
                if arr[mid] < target:
                    l = mid + 1
                elif arr[mid] > target:
                    r = mid - 1
                elif arr[mid] == target:
                    r = mid - 1
            if l < 0 or l > len(arr) - 1:
                return -1
            return l if arr[l] == target else -1
        def searchRight(arr, target):
            l = 0
            r = len(arr) - 1
            while l <= r:
                mid = (l + r) // 2
                if arr[mid] < target:
                    l = mid + 1
                elif arr[mid] > target:
                    r = mid - 1
                elif arr[mid] == target:
                    l = mid + 1
            if r < 0 or r > len(arr) - 1:
                return -1
            return r if arr[r] == target else -1

        return [searchLeft(nums, target), searchRight(nums, target)]