Middle
/* Dva sortirana spiska sa intervalima prisustva korisnika na mreži tokom dana su data. Početak intervala je strogo manji od kraja. Potrebno je izračunati intervale kada su oba korisnika bila na mreži. Intervali su navedeni u satima, uz pretpostavku da mogu biti od 0 do 24. */ presek( [[8, 12], [17, 22]], [[5, 11], [14, 18], [20, 23]] )// [[8, 11], [17, 18], [20, 22]] presek( [[9, 15], [18, 21]], [[10, 14], [21, 22]] )// [[10, 14]] function presek(korisnik1, korisnik2) { // napišite svoj kod ovde }
sobes.tech АИ
Одговор од АИ
Для нахождения пересечения двух списков интервалов можно использовать алгоритм с двумя указателями, проходя по обоим спискам одновременно и вычисляя пересечения текущих интервалов.
Пример решения на JavaScript:
function intersection(user1, user2) {
let i = 0, j = 0;
const result = [];
while (i < user1.length && j < user2.length) {
const start = Math.max(user1[i][0], user2[j][0]);
const end = Math.min(user1[i][1], user2[j][1]);
if (start < end) { // есть пересечение
result.push([start, end]);
}
// сдвигаем указатель у того интервала, который заканчивается раньше
if (user1[i][1] < user2[j][1]) {
i++;
} else {
j++;
}
}
return result;
}
// Пример использования:
console.log(intersection(
[[8, 12], [17, 22]],
[[5, 11], [14, 18], [20, 23]]
));
// Выведет: [[8, 11], [17, 18], [20, 22]]
Этот алгоритм работает за время O(n + m), где n и m — длины списков интервалов.