目标最后位置lintcode458

有一个上升序列,问你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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值