K
Kotlin | LeetCode
@easy_kotlin_task1.8K подп.
116просмотров
6.5%от подписчиков
19 марта 2026 г.
statsScore: 128
Задача: 352. Data Stream as Disjoint Intervals Сложность: hard Дано поступление данных из последовательности неотрицательных целых чисел a1, a2, ..., an, необходимо обобщить увиденные числа в виде списка непересекающихся интервалов. Реализуйте класс SummaryRanges: SummaryRanges() Инициализирует объект с пустым потоком. void addNum(int value) Добавляет целое число в поток. int[][] getIntervals() Возвращает обобщение текущих чисел в потоке в виде списка непересекающихся интервалов [starti, endi]. Ответ должен быть отсортирован по starti. Пример: Input ["SummaryRanges", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals"] [[], [1], [], [3], [], [7], [], [2], [], [6], []] Output [null, null, [[1, 1]], null, [[1, 1], [3, 3]], null, [[1, 1], [3, 3], [7, 7]], null, [[1, 3], [7, 7]], null, [[1, 3], [6, 7]]] 👨‍💻 Алгоритм: 1⃣Инициализировать структуру данных TreeSet для хранения значений. 2⃣addNum(int value) Просто добавить value в values. Если эквивалент TreeSet вашего языка программирования позволяет дублировать значения, как например SortedList в Python, нужно также проверить, что value не существует в values, так как дубликаты нарушат алгоритм. 3⃣getIntervals Если values пуст, вернуть пустой массив. Создать пустой список интервалов. Установить left = right = -1. left представляет левую границу текущего интервала, а right представляет правую границу. Итерировать по values. На каждой итерации: Если left < 0, установить left = right = value. Иначе, если value = right + 1, установить right = value, так как мы можем продолжить текущий интервал. Иначе, мы не можем продолжить текущий интервал. Вставить [left, right] в intervals и установить left = right = value для начала нового интервала. Вставить [left, right] в intervals и вернуть intervals. 😎 Решение: class SummaryRanges { private val values = sortedSetOf<Int>() fun addNum(value: Int) { values.add(value) } fun getIntervals(): List<List<Int>> { if (values.isEmpty()) { return emptyList() } val intervals = mutableListOf<List<Int>>() var left = -1 var right = -1 for (value in values) { if (left < 0) { left = right = value } else if (value == right + 1) { right = value } else { intervals.add(listOf(left, right)) left = right = value } } intervals.add(listOf(left, right)) return intervals } } fun main() { val sr = SummaryRanges() sr.addNum(1) sr.addNum(3) sr.addNum(7) sr.addNum(2) sr.addNum(6) val intervals = sr.getIntervals() for (interval in intervals) { println("&#036;{interval[0]} &#036;{interval[1]}") } } Ставь 👍 и забирай 📚 Базу знаний
116
просмотров
2906
символов
Да
эмодзи
Нет
медиа

Другие посты @easy_kotlin_task

Все посты канала →
Задача: 352. Data Stream as Disjoint Intervals Сложность: ha — @easy_kotlin_task | PostSniper