Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 合并社区并找到最大社区的大小_Java_Algorithm_Linked List_Disjoint Sets - Fatal编程技术网

Java 合并社区并找到最大社区的大小

Java 合并社区并找到最大社区的大小,java,algorithm,linked-list,disjoint-sets,Java,Algorithm,Linked List,Disjoint Sets,我正在努力解决HackerRank上的这个问题。 我试着用一个自定义的链表节点列表来解决这个问题。它有三个字段:Node first、Node current和int sizeadd'是一个重载方法。它可以添加一个值或另一个节点列表。 我在评论中加入了NodeList的代码,因为这并不重要 字段:- static HashMap<Integer, Integer> personToIndex = new HashMap<>(); static int largestCir

我正在努力解决HackerRank上的这个问题。 我试着用一个自定义的链表节点列表来解决这个问题。它有三个字段:Node first、Node current和int sizeadd'是一个重载方法。它可以添加一个值或另一个节点列表。 我在评论中加入了NodeList的代码,因为这并不重要

字段:-

static HashMap<Integer, Integer> personToIndex = new HashMap<>();
static int largestCircleSize = 0;
static ArrayList<NodeList> groups = new ArrayList<>();

我也尝试过使用HashSet,但它也有同样的问题,所以我认为问题不在数据结构中。

由于不清楚解决方案到底出了什么问题(OP没有指定)-错误答案或某些测试用例超时,我将解释如何解决它

我们可以使用数据结构来表示朋友圈的集合

其基本思想是,在每个圆中,我们指定一个用于表示给定圆的成员。我们可以称之为根。在圆中查找多个成员总是委托给存储其大小的根

每个非根成员都指向其根成员,或者指向一个可以通过其到达根的成员。将来,当前根用户可能也会失去其社区的根用户状态,但随后它将指向新根用户,因此始终可以通过链式调用访问它

2
圆合并时,将在
2
以前的圆中选择一个新的根成员。可以在其中设置新的大小,因为以前的根已经包含两个圆的大小。但是新根是如何选择的呢?如果圆
1
的大小不小于圆
2
的大小,则将其选作新根

因此,对于这个问题,首先我们应该为
大小
定义占位符:

Map<Integer, Integer> people;
Map<Integer, Integer> sizes;
最后,我们需要一种方法为
2
给定的朋友建立一个社区:

int mergeCommunities(int x, int y) {
    //find a root of x
    x = findCommunityRoot(x);
    //find a root of y
    y = findCommunityRoot(y);

    // one-man circle has a size of 1
    if (!sizes.containsKey(x)) {
        sizes.put(x, 1);
    }
    // one-man circle has a size of 1
    if (!sizes.containsKey(y)) {
        sizes.put(y, 1);
    }

    // friends in the same circle so just return its size
    if (x == y) {
        return sizes.get(x);
    }

    sizeX = sizes.get(x);
    sizeY = sizes.get(y);
    if (sizeX >= sizeY) { 
        people.put(y, x);
        sizes.put(x, sizeY + sizeX); 
        return sizes.get(x);
    } else {
        people.put(x, y);
        sizes.put(y, sizeY + sizeX); 
        return sizes.get(y);
    }
}
因此,我们拥有在每次迭代中保存最大圆大小所需的一切:

List<Integer> maxCircle(int[][] queries) {
    List<Integer> maxCircles = new ArrayList<>();

    int maxSize = 1;
    for (int i = 0; i < queries.length; i++) {
        int size = mergeCommunities(queries[i][0], queries[i][1]);
        maxSize = Math.max(maxSize, size);
        maxCircles.add(maxSize);
    }

    return maxCircles;
}
List maxCircle(int[][]查询){
List maxCircles=new ArrayList();
int maxSize=1;
for(int i=0;i
int mergeCommunities(int x, int y) {
    //find a root of x
    x = findCommunityRoot(x);
    //find a root of y
    y = findCommunityRoot(y);

    // one-man circle has a size of 1
    if (!sizes.containsKey(x)) {
        sizes.put(x, 1);
    }
    // one-man circle has a size of 1
    if (!sizes.containsKey(y)) {
        sizes.put(y, 1);
    }

    // friends in the same circle so just return its size
    if (x == y) {
        return sizes.get(x);
    }

    sizeX = sizes.get(x);
    sizeY = sizes.get(y);
    if (sizeX >= sizeY) { 
        people.put(y, x);
        sizes.put(x, sizeY + sizeX); 
        return sizes.get(x);
    } else {
        people.put(x, y);
        sizes.put(y, sizeY + sizeX); 
        return sizes.get(y);
    }
}
List<Integer> maxCircle(int[][] queries) {
    List<Integer> maxCircles = new ArrayList<>();

    int maxSize = 1;
    for (int i = 0; i < queries.length; i++) {
        int size = mergeCommunities(queries[i][0], queries[i][1]);
        maxSize = Math.max(maxSize, size);
        maxCircles.add(maxSize);
    }

    return maxCircles;
}