Поиск диапазона чисел, который чаще всего встречается в списке

Сложность, которой я должен придерживаться, равна o(n), поэтому мне не разрешено использовать вложенные циклы. У меня есть приблизительное представление о том, что я хочу сделать, однако я не уверен, как сохранить нижнюю границу диапазона. Цель состоит в том, чтобы найти нижнюю границу интервала, содержащего наибольшее количество элементов. Обозначим L как длину диапазона. Что я пробовал:

lst = [1,2,3,4,5,5,6,6,6,12] #after sorting by radix
L = 3

for i in range(len(lst)): 
    lower_bound[i] = i
    upper_bound[i] = i + L  #in this case L = 3.

    #if i is in range of certain i and its upper_bound,
    #increment count for that interval
    # e.g. 1 is in range of 0-3, so count for lower_bound[1] will +1.
    # e.g. 6 is in range of 4-6, so count for lower_bound[4] will +3.

#return the lower_bound with max count 

Таким образом, для этого примера будет возвращено 3, поскольку 3-6 имеет 7 элементов (приоритет отдается минимальной нижней границе). Я не уверен, что это правильный подход :( Это выглядит правильно, учитывая сложность o (n)?


person ddoo dle    schedule 13.03.2021    source источник
comment
Если под n вы имеете в виду длину списка, то нет, это не o(n).   -  person Manuel    schedule 13.03.2021
comment
Задача довольно неясная, кстати, лучше добавить правильную спецификацию и пример.   -  person Manuel    schedule 13.03.2021
comment
Похоже, вы только что бросили это здесь и тут же ушли. Я полагаю, вы не особо заинтересованы в нашей помощи в конце концов.   -  person Manuel    schedule 13.03.2021


Ответы (1)


Если я правильно понимаю вашу проблему, ее можно решить, используя подход с двумя указателями.

Установите левый указатель (индекс) на 0, затем перемещайте правый индекс, пока разница элементов между lst[right] и lst[left] не станет больше, чем L.

Запомнить разницу индексов right - left

Переместите левый индекс, пока разница между элементами не станет меньше L

Снова переместите правый индекс, сравните разницу нового индекса с текущей, получите макс.

Повторять до конца списка

person MBo    schedule 13.03.2021