forked from AnasImloul/Leetcode-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathValid Arrangement of Pairs.cpp
46 lines (46 loc) · 1.38 KB
/
Valid Arrangement of Pairs.cpp
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
// Runtime: 2105 ms (Top 22.94%) | Memory: 477.9 MB (Top 17.92%)
class Solution {
public:
vector<vector<int>> validArrangement(vector<vector<int>>& pairs) {
int m = pairs.size();
// Eulerian Path
unordered_map<int, stack<int>> adj;
unordered_map<int, int> in;
unordered_map<int, int> out;
// reserve spaces for unordered_map may help in runtime.
adj.reserve(m);
in.reserve(m);
out.reserve(m);
for (int i = 0; i < m; i++) {
int u = pairs[i][0], v = pairs[i][1];
in[v]++;
out[u]++;
adj[u].push(v);
}
// find the starting node
int start = -1;
for (auto& p : adj) {
int i = p.first;
if (out[i] - in[i] == 1) start = i;
}
if (start == -1) {
// Eulerian Circuit -> start at any node
start = adj.begin()->first;
}
vector<vector<int>> ans;
euler(adj, ans, start);
reverse(ans.begin(), ans.end());
return ans;
}
private:
void euler(unordered_map<int, stack<int>>& adj, vector<vector<int>>& ans, int curr) {
auto& stk = adj[curr];
while (!stk.empty()) {
int nei = stk.top();
stk.pop();
euler(adj, ans, nei);
// postorder
ans.push_back({curr, nei});
}
}
};