Метод отрезков ii

В этом уроке ты
  • Решишь задачу с собеседования в BigTech.
  • Освоишь “метод отрезков” для решения задач.
Пример задачи с собеседования

Представь, что ты пришёл на собеседование. Интервьюер начинает озвучивать условие задачи…

Условие

Дан массив отрезков segments, где segments[i] содержит два числа: [начало, конец] отрезка. Нужно объединить все пересекающиеся отрезки и вернуть итоговый список из непересекающихся отрезков в порядке возрастания.

Считаем, что отрезки пересекаются, если у них есть хотя бы одна общая точка.

Пример 1
Ввод: segments = [[2,5],[1,3],[6,7]]
Вывод: [[1,5],[6,7]]
Пример 2
Ввод: segments = [[-3,10],[10,100]]
Вывод: [[-3,100]]
Оптимальное решение
public class Solution
{
    public static bool IsOverlapping(List<int> a, List<int> b)
    {
        return Math.Max(a[0], b[0]) <= Math.Min(a[1], b[1]);
    }

    public static List<int> MergeTwoSegments(List<int> a, List<int> b)
    {
        // отрезки обязательно должны пересекаться
        return new List<int> { a[0], Math.Max(a[1], b[1]) };
    }

    public static List<List<int>> Merge(List<List<int>> segments)
    {
        // Сортируем отрезки по первой точке
        segments.Sort((a, b) => a[0].CompareTo(b[0]));

        var result = new List<List<int>> { segments[0] };
        for (int i = 1; i < segments.Count; i++)
        {
            var segment = segments[i];
            if (IsOverlapping(result[result.Count - 1], segment))
            {
                result[result.Count - 1] = MergeTwoSegments(result[result.Count - 1], segment);
            }
            else
            {
                result.Add(segment);
            }
        }
        return result;
    }
}

Главная идея: сначала сортируем отрезки по начальной координате. Затем формируем результирующий список, начиная с первого отрезка. На каждом шаге проверяем, пересекается ли текущий отрезок с последним отрезком в результате. Если да — расширяем последний отрезок; если нет — добавляем новый.

Оценка сложности
  • Время: O(n*log(n)), где n – размер массива segments. Основная часть времени уходит на сортировку.
  • Память: O(n). Дополнительная память расходуется на результирующий массив и сортировку.
Метод отрезков

Метод отрезков — это общий подход к решению задач, основанный на сортировке отрезков и последующем анализе их пересечений или объединений (в зависимости от условия).

Что дальше

Скорее переходи к практике, чтобы отработать полученные знания и закрепить “метод отрезков”.