В вашем вопросе есть некоторая двусмысленность, так как в заявлении о проблеме говорится, что есть массив B, в котором ожидаемое вхождение каждого элемента, но в вашем коде вы, кажется, просто сопоставляете значение каждого элемента с его вхождением. В любом случае, алгоритм, описанный в этой статье , даст вам ответ.
Основная идея заключается в том, что вы должны сначала отсортировать запросы, чтобы вам не приходилось считать частоту элементы во всем диапазоне для каждого запроса (что приводит к сложности O(m*n)
для вашей текущей реализации). Алгоритм, описанный в статье, подсчитывает количество элементов, соответствующих требуемой частоте в диапазоне для каждого запроса (переменная currentAns
). Вам просто нужно сопоставить currentAns
с количеством элементов на карте (freq
), чтобы вывести 0 / 1.
РЕДАКТИРОВАТЬ:
Это может быть оптимизировано в дальнейшем. Вы можете избавиться от карты ha sh и сохранить частоты в массиве размером m. Сохраняйте количество элементов, соответствующих ожидаемой частоте, используя те же логики c, что и в ответе выше (currentAns
). Дополнительно следите за количеством различных элементов в диапазоне, используя другую переменную (скажем, distinctElements
), используя те же логики обновления c (обновление, когда частота больше 1). Выведите 1, если distinctElements==currentAns
, 0 в противном случае. Это снизит общую сложность до O(n*sqrt(n))
. В этом блоге приведено отличное объяснение алгоритма MO, а также пример кода для получения различных элементов в диапазоне.