题面如下:
之前一直不是很清楚二分法,只会写模板,直到上个学期看了数据结构那本教材才弄清楚,书写的是真的好。这题就是用这个的,用不同写法的二分找出不同位置的数(如果有多个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]