34_在排序数组中查找元素的第一个和最后一个位置



#方法一
def FirstSearch(nums, target):
    if len(nums)==0:
        return -1
    start = 0
    end = len(nums)-1
    while start<= end:
        mid = (start+end)//2
        if nums[mid] < target:
        	start = mid+1
        else:
            end = mid-1
    if start < len(nums) and nums[start] == target:
        return start
    return -1

def LastSearch(nums, target):
    if len(nums) == 0:
        return -1
    start = 0
    end = len(nums)-1
    while start<=end:
        mid = (start+end)//2
        if nums[mid] <= target:
        	start = mid+1
        else:
            end = mid-1
    if end >=0 and nums[end] == target:
        return end
    return -1

def searchRange(nums, target):
    first = FirstSearch(nums, target)
    end = LastSearch(nums, target)

    return [first, end]




# 方法二
def extreme_insertion_index(nums, target, left):
    lo = 0
    hi = len(nums)

    while lo < hi:
        mid = (lo+hi) // 2
        if nums[mid] > target or (left and target==nums[mid]):
            hi = mid
        else:
            lo = mid+1
    return lo

def searchRange(nums, target):
    left_idx = extreme_insertion_index(nums, target, True)

    if left_idx == len(nums) or nums[left_idx] != target:
        return [-1, -1]

    return [left_idx, extreme_insertion_index(nums, target, False)-1]

nums = [5, 7, 7, 8, 8, 10]
print(searchRange(nums, 8))



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值