刷到了Search for a Range这道题,题目很简单啦,就是要求求出符合要求的数字的起点和终点。时间复杂度要求是O(log n)。好吧,作为一个没有学过数据结构的人来讲,百度查到的是2分法。好吧,就用2分法来做这道题了。代码如下:
#coding=utf-8
def searchRange(nums, target):
global start
start = 0
global end
end = 0
result = []
def erfen(nums):
global start
global end
#空集
if nums == []:
start = -1
end = -1
#单个以及不存在的情况
elif len(nums) == 1:
if nums[0] == target:
start = start
end = end
else:
start = -1
end = -1
else:
#中间的数是要求的数
if nums[len(nums) / 2] == target:
for i in range(len(nums) / 2):
if nums[len(nums) / 2 - 1 - i] != target:
start = len(nums) / 2 - i + start
break
else:
start = start
if len(nums) / 2 + 1 == len(nums):
end = end + len(nums) / 2
else:
#奇偶数后面剩余的数不同
if len(nums) % 2 == 0:
for j in range(1, len(nums) / 2):
if nums[len(nums) / 2 + j] != target:
end = len(nums) / 2 + j + end -1
break
else:
end = len(nums) - 1 + end
else:
for j in range(1, len(nums) / 2 + 1):
if nums[len(nums) / 2 + j] != target:
end = len(nums) / 2 + j + end - 1
break
else:
end = len(nums) - 1 + end
#中间的数小于要求的数
elif nums[len(nums) / 2] < target:
start = len(nums) / 2 + start
end = len(nums) / 2 + end
return erfen(nums[len(nums) / 2:])
#大于
else:
return erfen(nums[:len(nums) / 2])
erfen(nums)
result.append(start)
result.append(end)
return result
print searchRange([2,2],3)