题目:在一个排序数组(从小到大)中找一个数,返回该数出现的最后一个位置,如果不存在,返回-1
给出数组 [1, 2, 2, 2,4, 5, 5]
对于 target = 2, 返回 3.
对于 target = 5, 返回 6.
对于 target = 6, 返回 -1.
解题思路:
在二分搜索上做改进。
递归实现:
def last_position(array,low,high,key):
mid = int((high-low)/2 + low)
if low > high :
return -1
if low == high:#说明范围已经缩小到一个数(这样处理是为了防止数组越界)
return low
elif array[mid] > key:
return last_position(array,low,mid-1,key)
elif array[mid] < key:
return last_position(array,mid+1,high,key)
elif array[mid+1] == key:#不是最后一个位置,所以要接着搜索
return last_position(array,mid+1,high,key)
else:
return mid
循环实现:
def lastPosition(A, target):
if not A:
return -1
start, end = 0, len(A) - 1
while start + 1 < end:
mid = start + (end - start) / 2
if A[mid] <= target:
start = mid
else:#最后位置的要求
end = mid
if A[end] == target:
return end
if A[start] == target:
return start
return -1