##第一种边界:左右闭区间:
def dichotomyOne(nums,target):
#左右闭区间 终止条件为left = right + 1 [right,right+1]
# (即我们所找的对应的值没有大于这个并且小于后一个的中间值,因此为None)
#寻找一个数字
left = 0
right = len(nums)-1
while left <=right :
mid = (left + right)//2
if nums[mid]==target :
return mid
elif nums[mid]<target :
left = mid + 1
else:
right = mid - 1
return None
#此算法的局限性比如给定一个列表[1,5,5,5,8]
#此时target = 5时,只能返回对应索引2,但是对于索引1和3是无法进行操作的
#我们一般不会进行找到中间索引后,再进行左右的线性查找,这样不能确保时间复杂度
##第二种边界:左开右闭区间:
def dichotomyTwo(nums,target):
#左闭右开区间 终止条件为[left,left)一定满足循环的退出条件
#寻找左边界
left = 0
right = len(nums)#这里对应的开区间
while left < right :
mid = (left + right)//2
if nums[mid] == target :
right = mid#[left,mid)
elif nums[mid] > target :
right = mid#[left,mid)
else:
left = mid + 1#[mid+1,right)
return left
#right也可以,此时的终止条件为right = left
#此方法的函数返回值对应的left变量的返回值即对应的取值为[0,len(nums)]的
#对应的函数的含义为小于target的值有多少个
#找到最左侧边界,通过不断压缩right
def dichotomyThree(nums,target):
#寻找右边界
#同样是左闭右开的区间
left = 0
right = len(nums)
while left < right :
mid = (left + right)//2
if nums[mid] == target :
left = mid + 1#[mid+1,right)
elif nums[mid] < target:
left = mid + 1#[mid+1,right)
else:
right = mid#[left,mid)
return right-1
#主要作用便是找到最右侧边界,通过不断压缩最左侧边界
##第三种区间:左右开区间:
def dichotomyFour(nums,target):
#左右开区间的写法
#开区间的找左边界方法
left = -1
right = len(nums)
while left + 1 < right: # 区间不为空
mid = (left + right) // 2
if nums[mid] < target:
left = mid # 范围缩小到 (mid,right)
elif nums[mid] > target:
right = mid # 范围缩小到 (left,mid)
else:
right = mid #范围缩小到(left,mid)
return right # 或者 left+1
总结:
1.左右闭区间-单个适用于查找某一个数组或者具有维度的矩阵,列表中进行找对应的数字
2.左开右闭区间
2.1查找左边界-当中间索引号的具体数值与目标值相对应的时候继续向左压缩区间
具体用处:找到比最左侧某一个值小(左|2|右)左侧所有个数和
2.2查找右边界-当中间索引号的具体数值与目标值相对应的时候继续向右压缩区间
具体用处:找到比最右侧某一个值小(左|2|右)左侧所有个数和
3.左右开区间-同左闭右开区间一样,返回值有所变化 return = left + 1 / right