题目描述
给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。
对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。
如果数组中不存在该元素,则返回“-1 -1”。
输入格式
第一行包含整数n和q,表示数组长度和询问个数。
第二行包含n个整数(均在1~10000范围内),表示完整数组。
接下来q行,每行包含一个整数k,表示一个询问元素。
输出格式
共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。
如果数组中不存在该元素,则返回“-1 -1”。
数据范围
1≤n≤100000
1≤n≤100000
1≤q≤10000
1≤q≤10000
1≤k≤10000
1≤k≤10000
样例
输入样例:
6 3
1 2 2 3 3 4
3
4
5
输出样例:
3 4
5 5
-1 -1
用二分去查找元素要求数组的有序性或者拥有类似于有序的性质,对本题而言,一个包含重复元素的有序序列,要求输出某元素出现的起始位置和终止位置,翻译一下就是:在数组中查找某元素,找不到就输出−1 −1,找到了就输出不小于该元素的最小位置和不大于该元素的最大位置。所以,需要写两个二分,一个需要找到>=x的第一个数,另一个需要找到<=x的最后一个数。
def binary_Search(q,n,g):
for x in g:
l,r=0,n-1
while l<r:
mid=(l+r)//2
if x<=q[mid]:
r=mid
else:
l=mid+1//查找不小于X的第一个数
if q[l]!=x:
print("-1 -1")
continue
l1,r1=l,n
while l1+1<r1:
mid=(l1+r1)//2
if x<q[mid]:
r1=mid
else:
l1=mid//查找不大于x的最后一个数
print(l,l1)
n,m=map(int,input().split())//数组有n个元素,要查找m个元素
q=list(map(int,input()))//数组
g = [int(input()) for _ in range(m)]
binary_Search(q,n,g)
这里特别要注意在查找不大于x的最后一个数的边界问题!!!这里做个思维导图帮忙理解。