Рубрики
Без рубрики

Решение: избыточное соединение

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или … помеченные алгоритмами, JavaScript, Java, Python.

Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ

Проблема летета # 684 (средний): Избыточное соединение

Описание:

( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++

В этой проблеме дерево – это Незапряженный график Это связано и не имеет циклов.

Вам дан график, который начался как дерево с n Узлы, помеченные из 1 к n с добавлением одного дополнительного края. Добавленный край имеет два разные вершины, выбранные из 1 к n и был не крайний край, который уже существовал. График представлен как массив края длины n где края [я] = [AI, BI] Указывает, что между узлами ai. и BI на графике.

Верните край, который можно удалить, так что результирующий график – это дерево n узлы. Если есть несколько ответов, верните ответ, который возникает последним на входе.

Примеры:

Вход: края = [[1,2],[1,3],[2,3]]
Выход: [2,3]
Визуальный
Вход: края = [[1,2],[2,3],[3,4],[1,4],[1,5]]
Выход: [1,4]
Визуальный

Ограничения:

  • N.Length
  • 3
  • края [I] .length
  • 1
  • ai.
  • Нет повторных ребер.
  • Данный график подключен.

Идея:

( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++

В этой проблеме резервный край будет тот, который связывает вместе уже связанный график. Чтобы определить, были ли уже были обнаружены сегменты графика графика, мы можем использовать простой Союз найди ( UF ) Реализация для отслеживания различных сегментов.

С Уф Мы должны определить две функции: Союз и Найти Отказ Найти Функция будет рекурсивно Отслеживайте родитель узла обратно в свой лучший родитель и обновите его значение в родительском массиве ( PAR ), обеспечивая ярлык для следующей ссылки.

Союз Функция объединяет два сегмента, присваивая окончательный родитель одного сегмента к другому.

Мы можем проиграть через ребра и Найти Обе вершины края, чтобы увидеть, принадлежат ли они к одному и тому же сегменту. Если это так, мы находим наш избыточный край и может вернуть Это. Если нет, мы должны объединить два разных сегмента с Союз Отказ

  • Сложность времени: O (n) куда N это длина ребра
  • Космическая сложность: O (n) для авария а также стек рекурсии

Код JavaScript:

( Перейти к : Описание проблемы Идея решения

var findRedundantConnection = function(edges) {
    let par = Array.from({length: edges.length + 1}, (_,i) => i)
    const find = x => x === par[x] ? par[x] : par[x] = find(par[x])
    const union = (x,y) => par[find(y)] = find(x)
    for (let [a,b] of edges)
        if (find(a) === find(b)) return [a,b]
        else union(a,b)
};

Код Python:

( Перейти к : Описание проблемы Идея решения

class Solution:
    def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
        par = [i for i in range(len(edges) + 1)]
        def find(x: int) -> int:
            if x != par[x]: par[x] = find(par[x])
            return par[x]
        def union(x: int, y: int) -> None:
            par[find(y)] = find(x)
        for a,b in edges:
            if find(a) == find(b): return [a,b]
            else: union(a,b)

Java код:

( Перейти к : Описание проблемы Идея решения

class Solution {
    public int[] findRedundantConnection(int[][] edges) {
        par = new int[edges.length+1];
        for (int i = 0; i < par.length; i++)
            par[i] = i;
        for (int[] e : edges)
            if (find(e[0]) == find(e[1])) return e;
            else union(e[0],e[1]);
        return edges[0];
    }
    private int[] par;
    private int find(int x) {
        if (x != par[x]) par[x] = find(par[x]);
        return par[x];
    }
    private void union(int x, int y) {
        par[find(y)] = find(x);
    }
}

C ++ код:

( Перейти к : Описание проблемы Идея решения

class Solution {
public:
    vector findRedundantConnection(vector>& edges) {
        par.resize(edges.size()+1);
        for (int i = 0; i < par.size(); i++)
            par[i] = i;
        for (auto& e : edges)
            if (find(e[0]) == find(e[1])) return e;
            else uniun(e[0],e[1]);
        return edges[0];
    }
private:
    vector par;
    int find(int x) {
        if (x != par[x]) par[x] = find(par[x]);
        return par[x];
    }
    void uniun(int x, int y) {
        par[find(y)] = find(x);
    }
};

Оригинал: “https://dev.to/seanpgallivan/solution-redundant-connection-44ha”