2024-11-30 Daily Challenge
Today I have done leetcode's November LeetCoding Challenge with cpp
.
November LeetCoding Challenge 30
Description
Valid Arrangement of Pairs
You are given a 0-indexed 2D integer array pairs
where pairs[i] = [starti, endi]
. An arrangement of pairs
is valid if for every index i
where 1 <= i < pairs.length
, we have endi-1 == starti
.
Return any valid arrangement of pairs
.
Note: The inputs will be generated such that there exists a valid arrangement of pairs
.
Example 1:
Input: pairs = [[5,1],[4,5],[11,9],[9,4]] Output: [[11,9],[9,4],[4,5],[5,1]] Explanation: This is a valid arrangement since endi-1 always equals starti. end0 = 9 == 9 = start1 end1 = 4 == 4 = start2 end2 = 5 == 5 = start3
Example 2:
Input: pairs = [[1,3],[3,2],[2,1]] Output: [[1,3],[3,2],[2,1]] Explanation: This is a valid arrangement since endi-1 always equals starti. end0 = 3 == 3 = start1 end1 = 2 == 2 = start2 The arrangements [[2,1],[1,3],[3,2]] and [[3,2],[2,1],[1,3]] are also valid.
Example 3:
Input: pairs = [[1,2],[1,3],[2,1]] Output: [[1,2],[2,1],[1,3]] Explanation: This is a valid arrangement since endi-1 always equals starti. end0 = 2 == 2 = start1 end1 = 1 == 1 = start2
Constraints:
1 <= pairs.length <= 105
pairs[i].length == 2
0 <= starti, endi <= 109
starti != endi
- No two pairs are exactly the same.
- There exists a valid arrangement of
pairs
.
Solution
class Solution {
public:
vector<vector<int>> validArrangement(vector<vector<int>>& pairs) {
int sz = pairs.size();
map<int, vector<int>> neighbors;
map<int, int> degree;
for(const auto &p : pairs) {
neighbors[p[0]].push_back(p[1]);
degree[p[0]] += 1;
degree[p[1]] -= 1;
}
int current = neighbors.begin()->first;
for(const auto &[p, d] : degree) {
if(d == 1) current = p;
}
vector<int> path;
vector<int> st = {current};
while(st.size()) {
int current = st.back();
if(neighbors[current].empty()) {
path.push_back(current);
st.pop_back();
} else {
int next = neighbors[current].back();
neighbors[current].pop_back();
st.push_back(next);
}
}
vector<vector<int>> answer;
reverse(path.begin(), path.end());
for(int i = 0; i < sz; ++i) {
answer.push_back({path[i], path[i + 1]});
}
return answer;
}
};