Leetcode Link: 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

题目

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

解法一

思路:根据提示,可知本题必然使用二分法。

但是本题不能使用二分查到一个target后再通过 +1 或者 -1 的遍历去查找上下边界,因为这样的结果是一个的复杂度。本题必需使用两次二分查找分别找到上下边界。

本题使用红蓝边界的二分建模方法,该建模方法需要重点考虑边界的划分条件。

题解

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        left = -1
        right = len(nums)
        res = [-1,-1]
        # 找下边界,红蓝边界的条件是:蓝色<target,最后检查right
        while(left+1 != right): # 边界不重合就继续
            mid = (left + right) // 2
            if nums[mid] < target:
                left = mid
            else:
                right = mid
        if (right<len(nums) and nums[right]>target) or right>=len(nums):
            return [-1, -1]
        elif right<len(nums) and nums[right]==target:
            res[0] = right
        
        # 找上边界,红蓝边界的条件是:蓝色<=target,最后检查left
        left = -1
        right = len(nums)
        while(left+1!=right):
            mid = (left+right) // 2
            if nums[mid] <= target:
                left = mid
            else:
                right = mid
        res[1] = left
        return res