Java 合并社区并找到最大社区的大小
我正在努力解决HackerRank上的这个问题。 我试着用一个自定义的链表节点列表来解决这个问题。它有三个字段:Node first、Node current和int sizeadd'是一个重载方法。它可以添加一个值或另一个节点列表。 我在评论中加入了NodeList的代码,因为这并不重要 字段:-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
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;
}