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

题目链接
难度:中等       类型: 二分搜索


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

你的算法时间复杂度必须是 O(log n) 级别。

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

示例1

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例2

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

解题思路


用两次二分搜索,一次找左边界,一次找右边界
找两个边界的方式不太一样
找左边界时,若nums[mid]==target,要移动右指针
找右边界时,若nums[mid]==target,要移动左指针

找右边界时,左指针直接指向左边界会减小搜索范围

代码实现

class Solution(object):
    def search_border(self, nums, target, l, is_left):
        r = len(nums)
        while ltarget or (is_left and target==nums[mid]):
                r = mid
            else:
                l = mid + 1 
        return l
    
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        left = self.search_border(nums, target, 0, True)
        if left==len(nums) or nums[left]!=target:
            return [-1,-1]      
        right = self.search_border(nums, target, left, False) - 1  
        return [left, right]

本文链接:https://www.jianshu.com/p/16f1677f2e03

你可能感兴趣的:(LeetCode-python 34.在排序数组中查找元素的第一个和最后一个位置)