Skip to content

Commit 7b16bc1

Browse files
committed
try to shave more efficincy gains obvs not enough
1 parent 52f5766 commit 7b16bc1

File tree

1 file changed

+26
-22
lines changed

1 file changed

+26
-22
lines changed

src/main/java/io/github/clormor/hackerrank/advanced/visitor/TreeParser.java

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package io.github.clormor.hackerrank.advanced.visitor;
22

3-
import java.util.ArrayList;
43
import java.util.Arrays;
54
import java.util.HashMap;
65
import java.util.HashSet;
7-
import java.util.List;
86
import java.util.Map;
97
import java.util.Set;
108

@@ -20,10 +18,10 @@ public Tree solve(int n, String[] args) {
2018
mapColours(n, args[1]);
2119

2220
// parse the edge lines into numbers we can search for
23-
mapAllEdges(Arrays.copyOfRange(args, 2, n + 1));
21+
mapAllEdges(args);
2422

2523
// begin depth-first search - find children of the root
26-
List<Integer> edges = findNodeEdges(0);
24+
Set<Integer> edges = findNodeEdges(0);
2725

2826
// handle 1-node tree as special case
2927
if (edges.size() == 0) {
@@ -40,7 +38,7 @@ public Tree solve(int n, String[] args) {
4038
}
4139

4240
private void processNode(Integer node, int depth, TreeNode parent) {
43-
List<Integer> edges = findNodeEdges(node);
41+
Set<Integer> edges = findNodeEdges(node);
4442
if (edges.size() == 0) {
4543
parent.addChild(new TreeLeaf(values.get(node), colours.get(node), depth));
4644
} else {
@@ -52,31 +50,37 @@ private void processNode(Integer node, int depth, TreeNode parent) {
5250
}
5351
}
5452

55-
private List<Integer> findNodeEdges(int node) {
56-
List<Integer> result = new ArrayList<>();
57-
List<Integer> keysToRemove = new ArrayList<>();
58-
for (Integer key : allEdges.keySet()) {
59-
Set<Integer> edge = allEdges.get(key);
60-
if (edge.contains(node)) {
61-
edge.remove(node);
62-
result.add((Integer) edge.toArray()[0]);
63-
keysToRemove.add(key);
64-
}
53+
private Set<Integer> findNodeEdges(int node) {
54+
Set<Integer> result = allEdges.get(node);
55+
if (result == null) {
56+
return new HashSet<>();
6557
}
66-
for (Integer key : keysToRemove) {
67-
allEdges.remove(key);
58+
for (Integer i : result) {
59+
allEdges.get(i).remove(node);
6860
}
6961
return result;
7062
}
7163

7264
private void mapAllEdges(String[] edgeLines) {
7365
allEdges = new HashMap<>();
74-
for (int i = 0; i < edgeLines.length; i++) {
75-
Set<Integer> nodes = new HashSet<>();
66+
for (int i = 2; i < edgeLines.length; i++) {
7667
String[] edge = edgeLines[i].split(" ");
77-
nodes.add(Integer.parseInt(edge[0]) - 1);
78-
nodes.add(Integer.parseInt(edge[1]) - 1);
79-
allEdges.put(i, nodes);
68+
int a = Integer.parseInt(edge[0]) - 1;
69+
int b = Integer.parseInt(edge[1]) - 1;
70+
71+
Set<Integer> as = allEdges.get(a);
72+
if (as == null) {
73+
as = new HashSet<>();
74+
allEdges.put(a, as);
75+
}
76+
as.add(b);
77+
78+
Set<Integer> bs = allEdges.get(b);
79+
if (bs == null) {
80+
bs = new HashSet<>();
81+
allEdges.put(b, bs);
82+
}
83+
bs.add(a);
8084
}
8185
}
8286

0 commit comments

Comments
 (0)