Код работает дольше, чем нужно (python)

Рейтинг: 0Ответов: 3Опубликовано: 11.07.2023

я написала код по следующей задаче:

Требуется определить в заданном массиве количество элементов, 
равных искомому числу.

Входные данные
В первой строке вводится одно натуральное число 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 последних тестах проверяющей системы (эти тесты неизвестны) она превышает лимит по времени. Помогите пожалуйста её ускорить!

Ответы

▲ 3Принят

Вы зря вызываете сортировку каждый раз при вызове бинарного поиска для каждого искомого элемента.

В общем случае достаточно отсортировать список один раз - но здесь даже условие задачи гарантирует, что список уже отсортирован каждое следующее не меньше предыдущего.

▲ 1

Чтобы ускорить ваше решение, можно отсортировать список a один раз и сохранить в новую переменную

▲ 0
n = int(input())
nlist = list(map(int, input().split()))
m = int(input())
mlist = list(map(int, input().split()))
for i in range(len(mlist)):
    if nlist.count(mlist[i]) > 0:
        print(nlist.count(mlist[i]))
    else:
      print(0)