Думайте об этом как о скобках: (
для начала и интервала, )
до конца.Теперь проверьте границы для каждой пары [a, b] и маркеры начала / конца интервала подсчета для каждой позиции: нижнее число получает начало интервала слева;большее число получает близкий интервал вправо.Для данного ввода:
Process [4, 1]
result: [0, 1, 0, 0, 0, -1]
Process [1, 6]
result: [0, 2, 0, 0, 0, -1, 0, -1]
Process [6, 5]
result: [0, 2, 0, 0, 0, -1, 1, -2]
Теперь просто сделайте накопительную сумму из этого списка;позиция наибольшего значения - ваш желаемый ответ.
result: [0, 2, 0, 0, 0, -1, 1, -2]
cumsum: [0, 2, 2, 2, 2, 1, 2, 0]
Обратите внимание, что окончательная сумма должна быть 0 и никогда не может быть отрицательной.Наибольшее значение равно 2, которое появляется первым в позиции 1. Таким образом, 1 - это наименьшее целое число, отображающее максимальное (2) количество.
Нет, это один проход на входе и один проход в диапазоненомера.Обратите внимание, что с помощью простой таблицы значений вы можете сэкономить хранилище.Таблица обработки будет выглядеть примерно так:
[(1, 2)
(4, -1)
(5, 1)
(6, -2)]
Если у вас есть ввод с интервалами, начиная и заканчивая номером, то вам нужно сначала обработать запуски.Например, [4, 3, 2] будет выглядеть так:
[(2, 1)
(3, 1)
(3, -1)
(4, -1)]
ПРИМЕЧАНИЕ : поддержание отсортированного списка вставок составляет O (n ^ 2) время включенияразмер ввода;последующая сортировка списка O (n log n) .Либо это O (n) пробел.
Мое первое предложение, индексирование по самому числу, это O (n) время, но O (r) пробел в диапазоне входных значений.[