有一个上升序列,问你target在序列中最后出现的位置,没有的话返回-1。
用二分查找法。
当l<=r时,mid=l+(r-l)//2,当arr[mid]等于target并且它是最后出现位置时直接返回,最后出现位置的判别方法是mid是序列的最后一位,或者不是最后一位但是它的下一位比target大。
如果target<arr[mid],那么ans一定比mid小,那么往左边查找,令r=mid-1,递归调用查找函数。
剩下的情况就是arr[mid]<target或者arr[mid]等于target并且mid不是target最后出现的位置,那么,ans一定在mid的右边,令l=mid+1,调用递归查找函数。l是小写的L,对应代码的low,r对应high。
class Solution:
"""
@param nums: An integer array sorted in ascending order
@param target: An integer
@return: An integer
"""
# Python3 Program for recursive binary search.
# Returns index of x in arr if present, else -1
def last(self, arr, low, high, x, n) :
if (high >= low) :
mid = low + (high - low) // 2
if (( mid == n - 1 or x < arr[mid + 1]) and arr[mid] == x) :
return mid
elif (x < arr[mid]) :
return self.last(arr, low, (mid - 1), x, n)
else :
return self.last(arr, (mid + 1), high, x, n)
return -1
def lastPosition(self, nums, target):
# write your code here
return self.last(nums, 0, len(nums)-1, target, len(nums))
拓展:
如果问target最先出现的位置,怎么实现。
改一下当l<=r下的判断语句即可。
当target等于arr[mid]时,问的是最先出现的位置,所以ans只可能是当前的位置或者左边的位置,如果是当前的位置直接返回mid,当前位置是ans的情况是,当前位置是序列第一个位置或者当前位置的左边的数小于target。
def first(arr, low, high, x, n) :
if(high >= low) :
mid = low + (high - low) // 2
if( ( mid == 0 or x > arr[mid - 1]) and arr[mid] == x) :
return mid
elif(x > arr[mid]) :
return first(arr, (mid + 1), high, x, n)
else :
return first(arr, low, (mid - 1), x, n)
return -1