Это является частью серии объяснений решения 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: vectorfindRedundantConnection(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”