【hot100篇-python刷题记录】【在排序数组中查找元素的第一个和最后一个位置】

R7-二分查找篇

目录

双指针

二分优化 

ps:

思路:

双指针

直接用双指针回缩啊

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        ret=[-1,-1]
        left,right=0,len(nums)-1
        while left<len(nums):
            if nums[left]==target:
                ret[0]=left
                break
            left+=1
        while right>=0:
            if nums[right]==target:
                ret[1]=right
                break
            right-=1
        return ret

 

二分优化 

复杂度比较高,可以考虑使用二分查找优化。

突然有点印象,之前用的是二分查找,一个很好的思路:

bi_find二分查找函数返回left值,那第一次出现的位置start=left

然后比较start和len(nums)的关系(相等--》(-1,-1))

或者找不到?

接着是找到的情况,这是我们只需再调用该函数查找target+1的初始位置-1即可。

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        def bi_find(nums,target):
             left,right=0,len(nums)-1
             while left<=right:
                mid=(left+right)//2
                if nums[mid]<target:
                    left=mid+1
                else:
                    right=mid-1
             return left
        start=bi_find(nums,target)
        if start==len(nums) or nums[start]!=target:
            return [-1,-1]
        end=bi_find(nums,target+1)-1
        return [start,end] 

 

ps:

这里时间复杂度感觉受到target+1的值是否存在影响,例如2直接到1000,中间还会二分查找998遍,所以会复杂。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值