LeetCode-34. Find First and Last Position of Element in Sorted Array

前言

又一次深夜博客,今天室友睡得很早,十二点半不到就上床了(已经是很早了。。。),但是我这边却刚刚开始写,所以也一下子停不下来,就只能写晚再睡了。。。

问题描述

在这里插入图片描述

解法一

我的解法应该是最容易想到的一种解法吧,首先使用二分法,这个肯定是确定的。然后在找到目标值的位置后,分别向目标位置两边进行遍历,直到找到第一个与其不同的值,然后分别记录下其左右边界即可。下面就是俺的代码:

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        if n ==0:
            return [-1,-1]
        ans = []
        begin = 0
        end = n-1
        current = (int)((begin+end)/2)
        while end>=begin:
            if nums[current]==target:#找到了目标点
                begin = current
                end = current  
                while begin >=0 and nums[begin]==target :#找左边界
                    begin -= 1
                while  end < n and nums[end]==target:#找右边届
                    end+=1
                return[begin+1,end-1]
            elif nums[current]>target:#如果不是则接着找
                end = current-1
            else:
                begin = current+1
            current = (int)((begin+end)/2)
        return [-1,-1] #如果没有在循环里返回 则说明没有目标值

上述代码的复杂度只能说近似log(n),因为如果这个列表的所有元素都是目标值的话,它的复杂度就是O(n)了,但是平均下来的话其实就是log(n)。

解法二

第二种解法就是分别使用二分法,先找到左边界,然后再去找右边界,只不过在找的时候需要确定好条件,不然可能会找错(自己掉进这个坑了。。。)下面是代码实现:

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
            n = len(nums)
            if n==0:
                return [-1,-1]
            left = 0
            end = n
            while left<end:
                current = (left+end)//2
                if nums[current]<target :
                    left = current+1
                else:#如果相等或者比其大 则接着向左找 直到找到第一个与其相等的
                    end = current
            if left>=n or left<0 or nums[left]!=target:#如果找到了值 后面才会有
                return [-1,-1]
            begin = left
            right = n
            while begin<right:
                current = (begin+right)//2
                if nums[current]>target:
                    right = current
                else:#如果相等或者比其小则一直向右寻找 直到找到第一个比目标值大的
                    begin = current+1
            return [left,right-1]    

这个的算法复杂度就是log(n),但是实际的运行时间竟然比上面的那个还要长。。。可能目标值的个数很少吧,所以才会前面的运行的快一些。。。。

总结

好了,码字码完了,感觉自己也就晚上会有时间了吧,所以以后有时间就晚上写博客吧,反正晚上也睡不着,室友也不睡。。。。。唉,看来都是爱学习的好孩纸!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值