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

在这里插入图片描述
我的思路就是二分法(虽然最后落实的时候,写成了递归形式),虽然效率不怎么高,但是我第一个不看解析的写的中等难度的题.T^T.

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        
        left, right = 0, len(nums)
        self.first, self.last = -1, -1
        if right == 0 : 
            return [-1, -1]

        def binarySearch(left, right, flag): # flag 表示有没有找到基准位置, -1没找到,现在找基准,1找到了基准,现在找开始位置,2表示找到了基准,现在找结束位置
            
            print('left,right:',left, right)
            print('first:', self.first)
            print('last:', self.last)
            if left > right : return
            
            mid = (left + right) // 2
            if nums[mid] == target: # 找到了基准
                print('mid:', mid)
                if flag == -1: # 第一次遇到target,左右两边都没办法不查询
                    self.first, self.last = mid, mid
                    binarySearch(left, mid-1, 1) # 查找左边部分,找开始位置
                    binarySearch(mid+1, right, 2) # 查找右边部分,找结束位置
                elif flag == 1: # 遇到过target,现在找开始的位置,当前位置又是target,只要再往左边查找就行
                    self.first = mid
                    binarySearch(left, mid-1, 1)
                elif flag == 2: # 遇到过target,现在找结束的位置,当前位置又是target,只要再往右边查找就行
                    self.last = mid
                    binarySearch(mid+1, right, 2)
            elif nums[mid] < target:
                binarySearch(mid+1, right, flag) # check right
            else:
                binarySearch(left, mid-1, flag) # check left
            

        binarySearch(left, right-1, -1)

        return [self.first, self.last]

看了参考答案,用的两次二分,分别差左边界和右边界。好像效率也没提升多少…窃喜.jpg
在这里插入图片描述
参考链接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值