前言
又一次深夜博客,今天室友睡得很早,十二点半不到就上床了(已经是很早了。。。),但是我这边却刚刚开始写,所以也一下子停不下来,就只能写晚再睡了。。。
问题描述
解法一
我的解法应该是最容易想到的一种解法吧,首先使用二分法,这个肯定是确定的。然后在找到目标值的位置后,分别向目标位置两边进行遍历,直到找到第一个与其不同的值,然后分别记录下其左右边界即可。下面就是俺的代码:
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),但是实际的运行时间竟然比上面的那个还要长。。。可能目标值的个数很少吧,所以才会前面的运行的快一些。。。。
总结
好了,码字码完了,感觉自己也就晚上会有时间了吧,所以以后有时间就晚上写博客吧,反正晚上也睡不着,室友也不睡。。。。。唉,看来都是爱学习的好孩纸!