##Binary Search - 二分搜索 二分搜索是一种在有序数组中寻找目标值的经典方法,也就是说使用前提是『有序数组』。非常简单的题中『有序』特征非常明显,但更多时候可能需要我们自己去构造『有序数组』。下面我们从最基本的二分搜索开始逐步深入。
class Solution:
def search_range(self, array, target):
ret = [-1, -1]
if not array:
return ret
# search first position of target
st, ed = 0, len(array) - 1
while st + 1 < ed:
mid = (st + ed) / 2
if array[mid] == target:
ed = mid
elif array[mid] < target:
st = mid
else:
ed = mid
if array[st] == target:
ret[0] = st
elif array[ed] == target:
ret[0] = ed
# search last position of target
st, ed = 0, len(array) - 1
while st + 1 < ed:
mid = (st + ed) / 2
if array[mid] == target:
st = mid
elif array[mid] < target:
st = mid
else:
ed = mid
if array[ed] == target:
ret[1] = ed
elif array[st] == target:
ret[1] = st
return ret
源码分析 search range的问题可以理解为, 寻找第一次target出现的位置和最后一次target出现的位置。 当寻找第一次target出现位置的循环中, array[mid] == target表示, target可以出现在mid或者mid更前的位置, 所以将ed移动到mid。当循环跳出时, st的位置在ed之前,所以先判断在st位置上是否是target, 再判断ed位置。当寻找最后一次target出现位置的循环中,array[mid] == target表示, target可以出现在mid或者mid之后的位置, 所以将st移动到mid。 当循环结束时,ed的位置比st的位置更靠后, 所以先判断ed的位置是否为target, 再判断st位置。 最后返回ret。