综合使用课上所讲的两种二分模板;
1. 找左边的最后一个:
定义性质: 左边元素满足<=target , 结果是查找范围的右边界;
2. 找右边的第一个:
定义性质: 左边元素满足< target (即右边元素>=target ),结果是查找范围的左边界;
注意:
1. python除法不会自动向下取整, 需要手动int()
;
2. 二分法一定会输出结果, 但这个结果不一定是满足要求的, 需要额外判断;
# 数组共有n个数, 查询q次
n, q = map(int, input().split())
# 读取数组
nums = list(map(int, input().split()))
def get_right(target): # 获取左边数组的右边界
l = 0
r = n - 1
while l < r:
mid = int((l + r + 1) / 2)
if (nums[mid] <= target): # 左边数组的性质: <= target
l = mid
else:
r = mid - 1
return l
def get_left(target): # 获取右边数组的左边界
l = 0
r = n - 1
while l < r:
mid = int((l + r) / 2)
if (nums[mid] >= target): # 右边数组的性质:>= target
r = mid
else:
l = mid + 1
return l
# q次查询
for i in range(q):
target = int(input())
left = get_left(target)
right = get_right(target)
if nums[left] == target and nums[right] == target:
print(get_left(target), get_right(target))
else:
print(-1, -1)