关于二分查找法,高低限+-1的思考

low = 0
high = len(nums) - 1 
mid = (low + high) / 2

当nums的个数为奇数时,mid的值将正好是nums的正中间的那个

当nums的个数为偶数时,mid的值将是偶数/2的那个。如[0,1,2,3,4,5],则将取到第3个值,即取2。其实这样有点“左偏的意思了”


也许正是由于这个性质,使得左限每次都要+1(如二分查找,寻找数组的最小数字的题目里)。否则可能会使得mid陷在最左里

然而对于high来说,-1并不需要(即可以:high = mid)


3.23

注:剑指Offer上的一半以上的数字,也适用这个东西。


2018.3.28

然而在剑指offer的第53题上,在二分式查找元素时,不能甩掉-1.

所以还是老老实实high = mid_index -1 吧

#coding=utf8

def getLocation(target,nums):
    FirstLoc = getFirstLoc(target, nums)
    LastLoc = getLastLoc(target,nums)
    return [FirstLoc,LastLoc]

def helper_first(target,nums,start,end):
    if (start>end): return -1

    if (start<= end):
        mid_index = int((start + end) /2)
        if (nums[mid_index] == target):
            if (mid_index >0 and nums[mid_index-1] !=target) or (mid_index == 0):
                return mid_index
            else:
                end = mid_index - 1
        elif nums[mid_index] >target:
            end = mid_index - 1
        else:
            start = mid_index + 1
        return helper_first(target, nums, start, end)

def helper_last(target,nums,start,end):
    if (start > end): return -1
    mid_index = int((start + end) / 2)
    if (start <= end):
        if (nums[mid_index] == target):
            if (mid_index < len(nums)-1 and nums[mid_index + 1] != target) or (mid_index == len(nums)-1):
                return mid_index
            else:
                start = mid_index + 1
        elif nums[mid_index] < target:
            start = mid_index + 1
        else:
            end = mid_index - 1
        return helper_last(target, nums, start, end)

def getFirstLoc(target, nums):
    start = 0
    end = len(nums) - 1
    return helper_first(target, nums, start ,end)


def getLastLoc(target, nums):
    start = 0
    end = len(nums) - 1
    return helper_last(target, nums, start ,end)


nums = [1,2,3,3,3,3,4,5]
# nums = [3,3]
# nums = [-9,-8,-7,-5,-4,-3,-2,-1,0,1,2,2,2,3]
# nums = [1,2,3,4]
print(getLocation(3,nums))

猜你喜欢

转载自blog.csdn.net/leokingszx/article/details/79464472