-
Notifications
You must be signed in to change notification settings - Fork 119
/
Copy pathCount Pairs Of Nodes.java
61 lines (48 loc) · 2.25 KB
/
Count Pairs Of Nodes.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Runtime: 56 ms (Top 80.0%) | Memory: 92.30 MB (Top 62.86%)
class Solution {
// Time : O(E + N + Q)
// Space : O(N + E)
public int[] countPairs(int n, int[][] edges, int[] queries) {
// Key: edge ID Value: count of duplicate edge
Map<Integer, Integer> edgeCount = new HashMap<>();
// degree[i] : number of edge for node i (0-indexed)
int[] degree = new int[n];
for (int[] e : edges) { // recording all edges ==> O(E) Time / Space
int u = e[0] - 1;
int v = e[1] - 1;
degree[u]++;
degree[v]++;
int eId = Math.min(u, v) * n + Math.max(u, v);
edgeCount.put(eId, edgeCount.getOrDefault(eId, 0) + 1);
}
// Key: Degree Value: Frequency (number of nodes with that degree)
Map<Integer, Integer> degreeCount = new HashMap<>(); // ==> O(U) Time / Space
int maxDegree = 0;
for (int d : degree) {
degreeCount.put(d, degreeCount.getOrDefault(d, 0) + 1);
maxDegree = Math.max(maxDegree, d);
}
int[] count = new int[2 * maxDegree + 1];
for (int d1 : degreeCount.keySet()) { // O(E)-time (seems to be O(U ^ 2))
for (int d2 : degreeCount.keySet()) {
count[d1 + d2] += (d1 == d2) ? degreeCount.get(d1) * (degreeCount.get(d1)- 1)
: degreeCount.get(d1) * degreeCount.get(d2);
}
}
for (int i = 0; i < count.length; i++) count[i] /= 2; // each pair is counted twice
for (int e : edgeCount.keySet()) { // O(E)-time
int u = e / n;
int v = e % n;
count[degree[u] + degree[v]]--;
count[degree[u] + degree[v] - edgeCount.get(e)]++;
}
for (int i = count.length - 2; i >= 0; i--) { // O(U)-time
count[i] += count[i+1];
}
int[] res = new int[queries.length]; // O(Q)-time
for (int q = 0; q < queries.length; q++) {
res[q] = ((queries[q] + 1) >= count.length) ? 0 : count[queries[q] + 1];
}
return res;
}
}