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

本文介绍了一种利用二分查找法在有序数组中查找特定元素起始和终止位置的方法。首先,通过标准二分查找定位目标元素,然后分别从左右两侧继续查找直至确定元素的首次和最后一次出现的位置。此方法适用于处理重复元素的情况。
摘要由CSDN通过智能技术生成

题目描述

在这里插入图片描述

解题思路

解法一:二分查找法

第一步:通过正常的二分查找法定位到要查找到的元素
第二步:定位到指定的元素后,再找到它的开始和结束位置
举例说明
在这里插入图片描述
当nums[mid] == target时,开始查找第一个和最后一个位置:

  • 查找第一个位置,为了缩小右边界,开始从左边查找,如果nums[mid] = nums[mid-1],则target出现的第一个位置还需继续向左查找,继续使用二分法得到mid=1,小于target,则L加1,继续使用二分法得到mid=2,且nums[mid] != nums[mid-1],则2为target出现的起始位置
  • 查找最后一个位置,同上开始从右边查找,如果nums[mid] = nums[mid+1],则target出现的最后一个位置还需继续向右查找,继续使用二分法得到mid=5,此时nums[mid] != nums[mid+1],则说明5为target出现的终止位置。

python代码

class Solution:
    def searchRange(self, nums, target):
        if not nums:
            return [-1,-1]
        n = len(nums)
# 查找第一个和最后一个元素
        def find(is_find_first):
            begin = 0
            end = n-1
            # if和elif的逻辑跟正常的二分查找一样
            while begin<=end:
                mid = begin+(end-begin)//2
                if nums[mid]>target:
                    end = mid-1
                elif nums[mid]<target:
                    begin = mid+1
                # 找到目标值了,开始定位到第一个和最后一个位置
                else:
                    # 查找第一个和最后一个逻辑很类似,这里用一个变量标记
                    # 是查找第一个还是查找最后一个
                    if is_find_first:
                        # 如果不满足条件,缩小右边界,继续往左边查找
                        if mid>0 and nums[mid]==nums[mid-1]:
                            end = mid-1
                        else:
                            return mid
                    else:
                        # 如果不满足条件,增大左边界,继续往右边查找
                        if mid<n-1 and nums[mid]==nums[mid+1]:
                            begin = mid+1
                        else:
                            return mid
            return -1
        return [find(True), find(False)]
s = Solution()
print(s.searchRange([5,7,8,8,8,8,10],8))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值