Sort Items by Groups Respecting Dependencies

Order items so that group membership stays contiguous and dependencies are respected — nested topological sorts.

Hard
Time O(V + E) Space O(V + E)
LeetCode
7 min read
topological-sort

Problem#

n items belong to groups. Each item has prerequisites. Return any ordering of items such that (a) all items in the same group are contiguous and (b) all prerequisites come before their dependents. -1 if impossible.

Hints#

Hint 1
Two nested topological sorts: one on groups, one on items within each group, with cross-group prereqs creating group-level edges.

Approach#

Assign items without a group their own unique group ID. Build two graphs: item-level (within-group edges and ignored cross-group), and group-level (cross-group edges). Topo-sort groups; within each group’s items, topo-sort. Concatenate.

Solution#

Sort Items by Groups
class Solution {
public:
vector<int> sortItems(int n, int m, vector<int>& group, vector<vector<int>>& beforeItems) {
for (int i = 0; i < n; ++i) if (group[i] == -1) group[i] = m++;
vector<vector<int>> itemAdj(n), grpAdj(m);
vector<int> itemIn(n, 0), grpIn(m, 0);
for (int i = 0; i < n; ++i) for (int p : beforeItems[i]) {
if (group[i] == group[p]) {
itemAdj[p].push_back(i);
++itemIn[i];
} else {
grpAdj[group[p]].push_back(group[i]);
++grpIn[group[i]];
}
}
auto topo = [](int n, vector<vector<int>>& adj, vector<int>& indeg) {
queue<int> q;
for (int i = 0; i < n; ++i) if (indeg[i] == 0) q.push(i);
vector<int> out;
while (!q.empty()) {
int u = q.front(); q.pop();
out.push_back(u);
for (int v : adj[u]) if (--indeg[v] == 0) q.push(v);
}
return (int)out.size() == n ? out : vector<int>{};
};
auto grpOrder = topo(m, grpAdj, grpIn);
auto itemOrder = topo(n, itemAdj, itemIn);
if (grpOrder.empty() || itemOrder.empty()) return {};
unordered_map<int, vector<int>> itemsByGroup;
for (int it : itemOrder) itemsByGroup[group[it]].push_back(it);
vector<int> ans;
for (int g : grpOrder) for (int it : itemsByGroup[g]) ans.push_back(it);
return ans;
}
};

Editorial#

Two-level topo sort cleanly separates concerns: groups order across teams; items order within each team. Cross-group prereqs constrain group ordering; same-group prereqs constrain item ordering. Each topo independently runs Kahn’s.

Complexity#

  • Time: O(V + E).
  • Space: O(V + E).

Concept revision#

Search ESC

Keyboard shortcuts

Shortcuts are disabled while typing in inputs.