模版:
- 查找不小于target的第一个位置,即target<=x的x的位置:
mid = l + r + 1 >> 1
if num[mid] <= target: l = mid
else: r = mid - 1
- 查找不大于target的最后一个位置,即x<=target的x的位置
mid = l + r >> 1
if num[mid] >= target: r = mid
else: l = mid + 1
记忆:mid的数与target做比较时候取的符号,与target跟x之间关系的符号一致。
// target >= x , nums[mid] >= target
// target <= x, nums[mid] <= target
代码:
n, q = map(int,input().split())
num = list(map(int,input().split()))
while q:
target = int(input())
res = [-1, -1]
l, r = 0, n - 1
#查找不小于target的第一个位置,即target<=x的x的位置
while l < r:
mid = l + r + 1 >> 1
if num[mid] <= target: l = mid
else: r = mid - 1
if num[l] != target:
print(" ".join(map(str,res)))
else:
res[1] = l
l, r = 0, n - 1
#查找不大于target的最后一个位置,即x<=target的x的位置
while l < r:
mid = l + r >> 1
if num[mid] >= target: r = mid
else: l = mid + 1
res[0] = l
print(" ".join(map(str,res)))
q-=1