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))