Сложность: medium
Даны массивы доступных временных слотов slots1 и slots2 для двух человек и продолжительность встречи duration, верните самый ранний временной слот, который подходит обоим и имеет продолжительность duration.
Если нет общего временного слота, который удовлетворяет требованиям, верните пустой массив.
Формат временного слота — это массив из двух элементов [start, end], представляющий инклюзивный временной диапазон от start до end.
Гарантируется, что никакие два доступных временных слота одного и того же человека не пересекаются друг с другом. То есть для любых двух временных слотов [start1, end1] и [start2, end2] одного и того же человека либо start1 > end2, либо start2 > end1.
Пример:
Input: slots1 = [[10,50],[60,120],[140,210]], slots2 = [[0,15],[60,70]], duration = 8
Output: [60,68]
👨💻 Алгоритм:
1⃣Отсортируйте оба массива slots1 и slots2 по времени начала.
2⃣Инициализируйте два указателя, указывающие на начало slots1 и slots2 соответственно.
3⃣Перебирайте, пока указатель1 не достигнет конца slots1 или указатель2 не достигнет конца slots2:
Найдите общий слот между slots1[pointer1] и slots2[pointer2].
Если общий слот больше или равен duration, верните результат.
В противном случае найдите слот, который заканчивается раньше, и передвиньте указатель.
Если общий слот не найден, верните пустой массив.
😎 Решение:
class Solution {
func minAvailableDuration(_ slots1: [[Int]], _ slots2: [[Int]], _ duration: Int) -> [Int] {
let slots1 = slots1.sorted { $0[0] < $1[0] }
let slots2 = slots2.sorted { $0[0] < $1[0] }
var pointer1 = 0
var pointer2 = 0
while pointer1 < slots1.count && pointer2 < slots2.count {
let intersectLeft = max(slots1[pointer1][0], slots2[pointer2][0])
let intersectRight = min(slots1[pointer1][1], slots2[pointer2][1])
if intersectRight - intersectLeft >= duration {
return [intersectLeft, intersectLeft + duration]
}
if slots1[pointer1][1] < slots2[pointer2][1] {
pointer1 += 1
} else {
pointer2 += 1
}
}
return []
}
}Ставь 👍 и забирай 📚 Базу знаний