递归或者循环实现last position of target

题目:在一个排序数组(从小到大)中找一个数,返回该数出现的最后一个位置,如果不存在,返回-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

推荐阅读更多精彩内容