我为以下任务编写了代码:
Требуется определить в заданном массиве количество элементов,
равных искомому числу.
Входные данные
В первой строке вводится одно натуральное число N, не превосходящее 105:
количество чисел в массиве.
Во второй строке вводятся N натуральных чисел, не превосходящих 109,
каждое следующее не меньше предыдущего.
В третьей строке вводится количество искомых чисел
M - натуральное число, не превосходящее 106.
В четвертой строке вводится M натуральных чисел, не
превосходящих 109.
Выходные данные
Для каждого запроса выведите в отдельной строке одно число:
количество элементов массива, равных числу-запросу. Элементы
массива нумеруются с единицы.
Если в массиве нет такого числа, выведите 0.
Примеры
входные данные
4
1 2 2 4
4
1 4 3 2
выходные данные
1
1
0
2
我的代码:
def l_binar(a, x):
l=0
r=len(a)-1
ans=-1
while l<=r:
m=(l+r)//2
if a[m]==x:
ans=m
r=m-1
elif a[m]<x:
l=m+1
else:
r=m-1
return ans
#
def r_binar(a, x):
l=0
r=len(a)-1
ans=-1
while l<=r:
m=(l+r)//2
if a[m]==x:
ans=m
l=m+1
elif a[m]<x:
l=m+1
else:
r=m-1
return ans
###
n=int(input())
a=list(map(int, input().split()))
m=int(input())
b=list(map(int, input().split()))
for i in range(m):
if l_binar(sorted(a), b[i])+1!=0 and r_binar(sorted(a), b[i])+1!=0:
print(r_binar(sorted(a), b[i])+1-l_binar(sorted(a), b[i]))
else:
print(0)
它工作正常,但时间太长,在检查系统的最后2次测试中(这些测试未知),它超出了时间限制。请帮忙加快速度!
每次对要查找的每个元素调用二分搜索时,您都在浪费时间调用排序。
在一般情况下,对列表进行一次排序就足够了 - 但在这里,即使问题的条件也保证列表已经排序
каждое следующее не меньше предыдущего.为了加快决策速度,您可以对列表进行
a一次排序并将其存储在新变量中