1782. Count Pairs Of Nodes
Description
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 < b
incident(a, b) > 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
Solutions
Solution: Two Pointers + Hash Map
- Time complexity: O(nlogn+queries.length*edges.length)
- Space complexity: O(n+queries.length+edges.length)
JavaScript
js
/**
* @param {number} n
* @param {number[][]} edges
* @param {number[]} queries
* @return {number[]}
*/
const countPairs = function (n, edges, queries) {
const counts = Array.from({ length: n + 1 }, () => 0);
const connectedMap = new Map();
for (const [u, v] of edges) {
const minNode = Math.min(u, v);
const maxNode = Math.max(u, v);
if (!connectedMap.has(minNode)) {
connectedMap.set(minNode, new Map());
}
const connected = connectedMap.get(minNode);
const connectedCount = connected.get(maxNode) ?? 0;
connected.set(maxNode, connectedCount + 1);
counts[u] += 1;
counts[v] += 1;
}
const sortedCounts = [...counts].sort((a, b) => a - b);
return queries.map(query => {
let left = 1;
let right = n;
let count = 0;
while (left < right) {
if (sortedCounts[left] + sortedCounts[right] > query) {
count += right - left;
right -= 1;
} else {
left += 1;
}
}
for (const [u, connected] of connectedMap) {
for (const [v, connectedCount] of connected) {
if (counts[u] + counts[v] <= query) continue;
if (counts[u] + counts[v] - connectedCount <= query) {
count -= 1;
}
}
}
return count;
});
};