Показать сообщение отдельно
  #4 (permalink)  
Старый 17.03.2022, 20:11
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от рони
Math.min(...arr)
на здоровенном массиве это свалится в переполнение стека.

----
мой вариант:
function getMaxCount(dates) {
    const sortedByBegin = dates.slice().sort((a, b) => a[0] - b[0]);
    const ends = dates.map(d => d[1]).sort((a, b) => a - b);

    let count = 0, endPos = 0;
    return sortedByBegin.reduce((max, date, i) => {
        // учитываем все выезды, которые были после предыдущей проверки
        while (endPos < ends.length && ends[endPos] <= date[0]) {
            count--;
            endPos++;
        }

        return Math.max(max, ++count);
    }, 0);
}

alert(getMaxCount([
    [1, 2],
    [1, 3],
    [2, 4],
    [2, 3]
]));


работает за O(N * ln(N)) времени и O(N) памяти, но при этом не закладывается на максимальные даты, плюс можно применить например для отрезков, у которых начало и конец вещественные. Универсально, в общем.

если интервалы уже отсортированы по дате заезда, то вторую строку лучше переписать так
const sortedByBegin = dates;
Ответить с цитированием