题目描述
输入 n 个不超过 10的9次方 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a1,a2,…,an,然后进行 m 次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 −1。
输入格式
第一行 2个整数 n 和 m,表示数字个数和询问次数。
第二行 n 个整数,表示这些待查询的数字。
第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。
输出格式
输出一行,m 个整数,以空格隔开,表示答案。
输入输出样例
输入 #1
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6
输出 #1
1 2 -1
学了个二分查找,直接冲到了这个题目,结果没那么简单,麻了。
第一次代码,当然是没过:(
#(左闭右闭式)
def search(nums,target):
left,right=0,len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]<target:
left=mid+1
elif nums[mid]>target:
right=mid-1
else:
return mid
return -1
n,m=map(int,input().split())
nums=sorted(list(map(int,input().split())))
query=list(map(int,input().split()))
result=[]
for i in range(len(query)):
result.append(search(nums,query[i]))
问题:
1.编号不是从0开始
2.用几个实验会发现,如果有重复的,就不一定是第一次出现的编号了。
AC代码
def search(target):
left,right=0,len(nums)-1
count=-1
while left<=right:
mid=(left+right)//2
if nums[mid]==target: #找到之后继续二分,最后就能找到第一个编号
count=mid+1
if nums[mid]<target:
left=mid+1
else:
right=mid-1 #这里包含等于,给right移动退出循环
return count
n,m=map(int,input().split())
nums=sorted(list(map(int,input().split())))
query=list(map(int,input().split()))
for i in range(len(query)):
print(search(query[i]),end=' ')