#在递增数组中找大于等于x的第一个位置,从前向后看
def seekdadeng(nums,x):
left=0
right=len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]>=x: #右边部分都是大于等于x的部分
right=mid-1
else: #左边部分都是小于x的部分
left=mid+1
else:
return left
#while循环结束条件是left>right,即right+1=left
#循环不变量 nums[left-1]<x nums[right+1]>=x
#nums[left]=nums[right+1]>=x
#|1|2|3|5|8|8|9|
# | |
# right |
# left
#在递增数组中找大于x的第一个位置,从前向后看
#大于等于x时nums[mid]>=x 大于x时nums[mid]>x or 大于x就是大于等于x+1
def seekda(nums,x):
left=0
right=len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]>=x+1: #大于x就是大于等于x+1
right=mid-1
else:
left=mid+1
else:
return left
def seekda(nums,x):
left=0
right=len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]>x: #右边部分都是大于x的部分
right=mid-1
else: #左边部分都是小于等于x的部分
left=mid+1
else:
return left
#在递增数组中找小于x的第一个位置,是从后向前看的
#在递增数组中找小于x的最后一个位置,从先向后看
def seekxiao(nums,x):
left=0
right=len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]>=x: #小于x就是大于等于x的第一个位置的左边一位
right=mid-1
else:
left=mid+1
else:
return right # right就在left的左边一位
#在递增数组中找小于等于x的第一个位置,从后向前
#在递增数组中找小于等于x的最后一个位置,从前向后
def seekxiaodeng(nums,x):
left=0
right=len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]>=x+1: #小于等于x就是大于x的第一个位置的左边那个数,大于x又是大于等于x+1
right=mid-1
else:
left=mid+1
else:
return right #right在left的左边
#如果找大于x时,全是比x小的,那么left==len(nums)
#如果找小于x是,全是比x大的,那么right=len(nums)
二分 查找
最新推荐文章于 2025-12-09 19:50:25 发布
4259

被折叠的 条评论
为什么被折叠?



