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

Posted 农民小飞侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[leetcode] 34 在排序数组中查找元素的第一个和最后一个位置相关的知识,希望对你有一定的参考价值。

Description

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

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

提示:

  • 0 <= nums.length <= 105
  • -10^9 <= nums[i] <= 10^9
  • nums 是一个非递减数组
  • − 1 0 9 < = t a r g e t < = 1 0 9 -10^9 <= target <= 10^9 109<=target<=109

分析

这道题可以用常规的二分法写出来,但要注意下重复的情况,我是在找到一个target之后,向左向右进行拓展得到重复的边界的,稍微有点暴力。

代码

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        left =0 
        right=len(nums)-1
        min_index=2**31
        max_index=-1
        while(left<=right):
            mid=(left+right)//2
            if nums[mid]==target:
                left=mid
                while(left>=0 and nums[left]==target):
                    min_index=min(min_index,left)
                    left-=1
                right=mid
                while(right<len(nums) and nums[right]==target):
                    max_index=max(max_index,right)
                    right+=1
                break
            elif nums[mid]<target:
                left=mid+1
            else:
                right=mid-1

        if(min_index==2**31 and max_index==-1):
            return [-1,-1]
        else:
            return [min_index,max_index]

参考文献

find-first-and-last-position-of-element-in-sorted-array

以上是关于[leetcode] 34 在排序数组中查找元素的第一个和最后一个位置的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode] 34. 在排序数组中查找元素的第一个和最后一个位置(Java)

算法leetcode|34. 在排序数组中查找元素的第一个和最后一个位置(rust重拳出击)

[LeetCode]34. 在排序数组中查找元素的第一个和最后一个位置(二分)

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

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

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