题面如下:
之前一直不是很清楚二分法,只会写模板,直到上个学期看了数据结构那本教材才弄清楚,书写的是真的好。这题就是用这个的,用不同写法的二分找出不同位置的数(如果有多个target在nums中)。
注意找下限和上限时写法上的细微差别,思路就是找下限时在r左边的都是 小于等于 target的,因此如果碰到多个target,r也会不断地缩小。找上限思路类似,不过要注意由于判停条件依旧为l<r,因此mid=(l+r+1)/2,至于原因的话考虑只有两个数的情况就可以了。
另外python除法自动以浮点数存储所以要用int()。
class Solution: def searchRange(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ n = len(nums) if n==0: return [-1,-1] l = 0 r = n-1 while(l<r): mid = int((l+r+1)/2) if(nums[mid]<=target): l = mid else: r = mid-1 if nums[l]==target: up = l else: up = -1 l = 0 r = n-1 while(l<r): mid = int((l+r)/2) if(nums[mid]<target): l = mid + 1 else: r = mid if nums[r] == target: down = r else: down = -1 return [down,up]