Пусть N будет размером массива, а M - количеством различных значений в этом массиве.
Я рассматриваю две сложности: предварительную обработку и запрос интервала размером n, каждый должен быть пространственным и временным.
Решение 1:
- Пространственный: O (1) и O (M)
- Временные: O (1) и O (n + M)
Без предварительной обработки, мы смотрим на все значения интервала и находим наиболее частое.
Решение 2:
- Пространственные: O (M * N) и O (1)
- Временные: O (M * N) и O (мин (n, M))
Для каждой позиции массива у нас есть накопительный массив, который дает нам для каждого значения x сколько раз x находится в массиве до этой позиции.
Учитывая интервал, нам нужно, чтобы каждый x вычел 2 значения, чтобы найти число x в этом интервале. Итерируем по каждому x и находим максимальное значение. Если n
Решение 3:
- Пространственный: O (N) и O (1)
- Временные: O (N) и O (мин (n, M) * log (n))
Для каждого значения x построить двоичную кучу всех позиций в массиве, где присутствует x. Ключ в вашей куче - это позиция, но вы также сохраняете общее число x между этой позицией и началом массива.
Учитывая интервал, который нам нужно, чтобы каждый x вычел 2 значения, чтобы найти число x в этом интервале: в O (log (N)) мы можем попросить кучу x найти две позиции непосредственно перед началом конец интервала и вычесть числа. По сути, для этого требуется меньше места, чем для гистограммы, но теперь запрос в O (log (N)).