[LeetCode] 684. 중복 연결 (중간) (JAVA) 하루에 한 질문

[LeetCode] 684. 중복 연결 (중간) (JAVA)

제목 주소 : https://leetcode.com/problems/redundant-connection/

제목 설명:

이 문제에서 나무는 연결되어 있고 순환이없는 무 방향 그래프입니다.

주어진 입력은 N 개의 노드 (고유 한 값 1, 2,…, N 포함)가있는 트리로 시작되고 하나의 추가 간선이 추가 된 그래프입니다. 추가 된 가장자리에는 1에서 N까지 선택된 두 개의 다른 정점이 있으며 이미 존재하는 가장자리가 아닙니다.

결과 그래프는 가장자리의 2D 배열로 제공됩니다. 모서리의 각 요소는 노드 u와 v를 연결하는 무 방향 모서리를 나타내는 u <v를 갖는 쌍 [u, v]입니다.

결과 그래프가 N 노드의 트리가되도록 제거 할 수있는 간선을 반환합니다. 답변이 여러 개인 경우 주어진 2D 배열에서 마지막에 발생한 답변을 반환합니다. 답 모서리 [u, v]는 u <v 인 동일한 형식이어야합니다.

예 1 :

Input: [[1,2], [1,3], [2,3]]
Output: [2,3]
Explanation: The given undirected graph will be like this:
  1
 / \
2 - 3

예 2 :

Input: [[1,2], [2,3], [3,4], [1,4], [1,5]]
Output: [1,4]
Explanation: The given undirected graph will be like this:
5 - 1 - 2
    |   |
    4 - 3

노트 :

  • 입력 2D 배열의 크기는 3에서 1000 사이입니다.
  • 2D 배열에 표시되는 모든 정수는 1과 N 사이입니다. 여기서 N은 입력 배열의 크기입니다.

업데이트 (2017-09-26) :
문제 설명 + 테스트 케이스를 점검하고 그래프가 무 방향 그래프임을 명확하게 지정했습니다. 방향 그래프 후속 작업은 중복 연결 II)를 참조하십시오. 불편에 대해 사과드립니다.

일반적인 생각

이 문제에서 트리는 연결된 비순환 무 방향 그래프를 나타냅니다.

N 개의 노드 (노드 값은 1, 2,…, N을 반복하지 않음)와 추가 간선이있는 트리로 구성된 그래프를 입력합니다. 추가 가장자리의 두 정점은 1과 N 사이에 포함됩니다.이 추가 가장자리는 트리의 기존 가장자리에 속하지 않습니다.

결과 그래프는 간선의 2 차원 배열입니다. 각 모서리의 요소는 u <v를 만족하는 한 쌍의 [u, v]이며, 정점 u와 v를 연결하는 무 방향 그래프의 모서리를 나타냅니다.

결과 그래프가 N 개의 노드가있는 트리가되도록 삭제할 수있는 간선을 반환합니다. 답변이 여러 개인 경우 2 차원 배열의 마지막 모서리가 반환됩니다. 답변 [u, v]은 동일한 형식 u <v를 만족해야합니다.

문제 해결 방법

  1. 채택 및 찾기
  2. 두 노드의 부모 노드가 같으면 두 노드가 연결되어 결과가 직접 반환되고 두 노드의 부모 노드가 다른 경우 두 노드가 병합됨을 의미합니다.
class Solution {
    public int[] findRedundantConnection(int[][] edges) {
        int[] fa = new int[edges.length + 1];
        for (int i = 0; i < fa.length; i++) {
            fa[i] = i;
        }
        for (int i = 0; i < edges.length; i++) {
            if (find(fa, edges[i][0]) == find(fa, edges[i][1])) return edges[i];
            merge(fa, edges[i][0], edges[i][1]);
        }
        return new int[]{-1, -1};
    }

    private int find(int[] fa, int x) {
        if (fa[x] != x) return fa[x] = find(fa, fa[x]);
        return fa[x];
    }

    private void merge(int[] fa, int x, int y) {
        fa[find(fa, x)] = find(fa, y);
    }
}

실행 시간 : 1ms, Java 사용자의 87.99 %를 능가
메모리 소비 : 38.8MB, Java 사용자의 34.46 %를 능가

내 공식 계정에 주목 해 주셔서 감사합니다. LeetCode는 매일 하나의 질문을 업데이트합니다.

추천

출처blog.csdn.net/qq_16927853/article/details/112553203