1782. Count Pairs Of Nodes LeetCode Solution
In this guide, you will get 1782. Count Pairs Of Nodes LeetCode Solution with the best time and space complexity. The solution to Count Pairs Of Nodes problem is provided in various programming languages like C++, Java, and Python. This will be helpful for you if you are preparing for placements, hackathons, interviews, or practice purposes. The solutions provided here are very easy to follow and include detailed explanations.
Table of Contents
- Problem Statement
- Complexity Analysis
- Count Pairs Of Nodes solution in C++
- Count Pairs Of Nodes solution in Java
- Count Pairs Of Nodes solution in Python
- Additional Resources
Problem Statement of Count Pairs Of Nodes
You are given an undirected graph defined by an integer n, the number of nodes, and a 2D integer array edges, the edges in the graph, where edges[i] = [ui, vi] indicates that there is an undirected edge between ui and vi. You are also given an integer array queries.
Let incident(a, b) be defined as the number of edges that are connected to either node a or b.
The answer to the jth query is the number of pairs of nodes (a, b) that satisfy both of the following conditions:
a queries[j]
Return an array answers such that answers.length == queries.length and answers[j] is the answer of the jth query.
Note that there can be multiple edges between the same two nodes.
Example 1:
Input: n = 4, edges = [[1,2],[2,4],[1,3],[2,3],[2,1]], queries = [2,3]
Output: [6,5]
Explanation: The calculations for incident(a, b) are shown in the table above.
The answers for each of the queries are as follows:
– answers[0] = 6. All the pairs have an incident(a, b) value greater than 2.
– answers[1] = 5. All the pairs except (3, 4) have an incident(a, b) value greater than 3.
Example 2:
Input: n = 5, edges = [[1,5],[1,5],[3,4],[2,5],[1,3],[5,1],[2,3],[2,5]], queries = [1,2,3,4,5]
Output: [10,10,9,8,6]
Constraints:
2 <= n <= 2 * 104
1 <= edges.length <= 105
1 <= ui, vi <= n
ui != vi
1 <= queries.length <= 20
0 <= queries[j] < edges.length
Complexity Analysis
- Time Complexity: O(q(n + |\texttt{edges}|))
- Space Complexity: O(n + |\texttt{edges}|)
1782. Count Pairs Of Nodes LeetCode Solution in C++
class Solution {
public:
vector<int> countPairs(int n, vector<vector<int>>& edges,
vector<int>& queries) {
vector<int> ans(queries.size());
// count[i] := the number of edges of node i
vector<int> count(n + 1);
// shared[i][j] := the number of edges incident to i or j, where i < j
vector<unordered_map<int, int>> shared(n + 1);
for (const vector<int>& edge : edges) {
const int u = edge[0];
const int v = edge[1];
++count[u];
++count[v];
++shared[min(u, v)][max(u, v)];
}
vector<int> sortedCount(count);
ranges::sort(sortedCount);
int k = 0;
for (const int query : queries) {
for (int i = 1, j = n; i < j;)
if (sortedCount[i] + sortedCount[j] > query)
// sortedCount[i] + sortedCount[j] > query
// sortedCount[i + 1] + sortedCount[j] > query
// ...
// sortedCount[j - 1] + sortedCount[j] > query
// So, there are (j - 1) - i + 1 = j - i pairs > query
ans[k] += (j--) - i;
else
++i;
for (int i = 1; i <= n; ++i)
for (const auto& [j, sh] : shared[i])
if (count[i] + count[j] > query && count[i] + count[j] - sh <= query)
--ans[k];
++k;
}
return ans;
}
};
/* code provided by PROGIEZ */
1782. Count Pairs Of Nodes LeetCode Solution in Java
class Solution {
public int[] countPairs(int n, int[][] edges, int[] queries) {
int[] ans = new int[queries.length];
// count[i] := the number of edges of node i
int[] count = new int[n + 1];
// shared[i][j] := the number of edges incident to i or j, where i < j
Map<Integer, Integer>[] shared = new Map[n + 1];
for (int i = 1; i <= n; ++i)
shared[i] = new HashMap<>();
for (int[] edge : edges) {
final int u = edge[0];
final int v = edge[1];
++count[u];
++count[v];
shared[Math.min(u, v)].merge(Math.max(u, v), 1, Integer::sum);
}
int[] sortedCount = count.clone();
Arrays.sort(sortedCount);
int k = 0;
for (final int query : queries) {
for (int i = 1, j = n; i < j;)
if (sortedCount[i] + sortedCount[j] > query)
// sortedCount[i] + sortedCount[j] > query
// sortedCount[i + 1] + sortedCount[j] > query
// ...
// sortedCount[j - 1] + sortedCount[j] > query
// So, there are (j - 1) - i + 1 = j - i pairs > query
ans[k] += (j--) - i;
else
++i;
for (int i = 1; i <= n; ++i)
for (Map.Entry<Integer, Integer> p : shared[i].entrySet()) {
final int j = p.getKey();
final int sh = p.getValue();
if (count[i] + count[j] > query && count[i] + count[j] - sh <= query)
--ans[k];
}
++k;
}
return ans;
}
}
// code provided by PROGIEZ
1782. Count Pairs Of Nodes LeetCode Solution in Python
class Solution:
def countPairs(
self,
n: int,
edges: list[list[int]],
queries: list[int],
) -> list[int]:
ans = [0] * len(queries)
# count[i] := the number of edges of node i
count = [0] * (n + 1)
# shared[i][j] := the number of edges incident to i or j, where i < j
shared = [collections.Counter() for _ in range(n + 1)]
for u, v in edges:
count[u] += 1
count[v] += 1
shared[min(u, v)][max(u, v)] += 1
sortedCount = sorted(count)
for k, query in enumerate(queries):
i = 1
j = n
while i < j:
if sortedCount[i] + sortedCount[j] > query:
# sortedCount[i] + sortedCount[j] > query
# sortedCount[i + 1] + sortedCount[j] > query
# ...
# sortedCount[j - 1] + sortedCount[j] > query
# So, there are (j - 1) - i + 1 = j - i pairs > query
ans[k] += j - i
j -= 1
else:
i += 1
for i in range(1, n + 1):
for j, sh in shared[i].items():
if count[i] + count[j] > query and count[i] + count[j] - sh <= query:
ans[k] -= 1
return ans
# code by PROGIEZ
Additional Resources
- Explore all LeetCode problem solutions at Progiez here
- Explore all problems on LeetCode website here
Happy Coding! Keep following PROGIEZ for more updates and solutions.