zoukankan      html  css  js  c++  java
  • LeetCode 684. Redundant Connection

    原题链接在这里:https://leetcode.com/problems/redundant-connection/

    题目:

    In this problem, a tree is an undirected graph that is connected and has no cycles.

    The given input is a graph that started as a tree with N nodes (with distinct values 1, 2, ..., N), with one additional edge added. The added edge has two different vertices chosen from 1 to N, and was not an edge that already existed.

    The resulting graph is given as a 2D-array of edges. Each element of edges is a pair [u, v] with u < v, that represents an undirectededge connecting nodes u and v.

    Return an edge that can be removed so that the resulting graph is a tree of N nodes. If there are multiple answers, return the answer that occurs last in the given 2D-array. The answer edge [u, v] should be in the same format, with u < v.

    Example 1:

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

    Example 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

    Note:

    • The size of the input 2D-array will be between 3 and 1000.
    • Every integer represented in the 2D-array will be between 1 and N, where N is the size of the input array.

    Update (2017-09-26):
    We have overhauled the problem description + test cases and specified clearly the graph is an undirected graph. For the directed graph follow up please see Redundant Connection II). We apologize for any inconvenience caused.

    题解:

    For each edge, union edge[0] and edge[1]. If edge[0] and edge[1] are already in the same union. Then current edge is redundant.

    Time Complexity: O(nlogn). find takes O(logn). With path compression and union by weight, amatorize O(1).

    Space: O(n).

    AC Java:

     1 class Solution {
     2     int [] parent;
     3     int [] size;
     4     
     5     public int[] findRedundantConnection(int[][] edges) {
     6         int n = edges.length;
     7         parent = new int[n+1];
     8         size = new int[n+1];
     9         
    10         for(int i = 0; i<=n; i++){
    11             parent[i] = i;
    12             size[i] = 1;
    13         }
    14         
    15         for(int [] edge: edges){
    16             if(find(edge[0]) == find(edge[1])){
    17                 return edge;
    18             }
    19             
    20             union(edge[0], edge[1]);
    21         }
    22         
    23         return null;
    24     }
    25     
    26     private int find(int i){
    27         if(i != parent[i]){
    28             parent[i] = find(parent[i]);
    29         }
    30         
    31         return parent[i];
    32     }
    33     
    34     private void union(int i, int j){
    35         int p = find(i);
    36         int q = find(j);
    37         
    38         if(size[p] > size[q]){
    39             parent[q] = p;
    40             size[p] += size[q];
    41         }else{
    42             parent[p] = q;
    43             size[q] += size[p];
    44         }
    45     }
    46 }

    跟上Redundant Connection II.

  • 相关阅读:
    《Windows驱动开发技术详解》之派遣函数
    错误:无法解析外部符号
    《Windows驱动开发技术详解》之Windows内核函数
    《Windows驱动开发技术详解》之Windows内存管理
    《Windows驱动开发技术详解》之驱动程序的基本结构
    《Windows驱动开发技术详解》之编程加载NT式驱动
    二叉搜索树
    Trie树
    判断给定二叉树是否是平衡二叉树
    数字在排序数组中出现的次数
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/11236746.html
Copyright © 2011-2022 走看看