Вместо того, чтобы удалять в лоб, ты можешь поддерживать индекс первого неудаленного элемента head. Изначально он равен нулю. Тогда для получения очередной вершины ты делаешь queue[head++]
Теперь получение и "удаление" минимума работает за O(1) и не портит асимптотику.
Но возможно, это не пройдет по памяти. Тогда фикс: Если размер "живой" части оказался меньше "мертвой" (то есть 2*head > queue.length), то нужно удалить из queue первые head элементов (там есть метод по типу slice для этого), и положить head = 0.
Это, наверное, неочевидно, но асимптотика по времени остается O(1), а оверхэд памяти не выше двух раз
Теперь получение и "удаление" минимума работает за O(1) и не портит асимптотику.
Но возможно, это не пройдет по памяти. Тогда фикс: Если размер "живой" части оказался меньше "мертвой" (то есть 2*head > queue.length), то нужно удалить из queue первые head элементов (там есть метод по типу slice для этого), и положить head = 0.
Это, наверное, неочевидно, но асимптотика по времени остается O(1), а оверхэд памяти не выше двух раз
уффф, спасибо большoе. Да, было 2 ботлнека. Один таки в shift
Если кто-то ещё сталкивался с этой проблемой, нужно возвести число в степень (MOD -2), чтобы найти обратное число по модулю, то есть число в -1 степени. Вроде следствие из малой теоремы Ферма