2201. Valid Arrangement Of Pairs¶
Difficulty: Hard
LeetCode Problem View on GitHub
2201. Valid Arrangement of Pairs
Hard
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 <= 105pairs[i].length == 20 <= starti, endi <= 109starti != endi- No two pairs are exactly the same.
- There exists a valid arrangement of
pairs.
Solution¶
class Solution {
public int[][] validArrangement(int[][] pairs) {
Map<Integer, List<Integer>> graph = new HashMap<>();
Map<Integer, Integer> node = new HashMap<>();
for(int[] p : pairs){
if(!graph.containsKey(p[0])) graph.put(p[0], new ArrayList<>());
graph.get(p[0]).add(p[1]);
node.put(p[0], node.getOrDefault(p[0], 0) - 1);
node.put(p[1], node.getOrDefault(p[1], 0) + 1);
}
int startNode = pairs[0][0];
for(Map.Entry<Integer, Integer> entry : node.entrySet()){
if(entry.getValue() == -1){
startNode = entry.getKey();
break;
}
}
List<Integer> circuit = new ArrayList<>();
dfs(graph, startNode, circuit);
Collections.reverse(circuit);
int[][] result = new int[pairs.length][2];
for(int i = 1; i < circuit.size(); i++){
result[i - 1][0] = circuit.get(i - 1);
result[i - 1][1] = circuit.get(i);
}
return result;
}
public void dfs(Map<Integer, List<Integer>> graph, int u, List<Integer> res){
while(graph.containsKey(u) && !graph.get(u).isEmpty()){
int current = graph.get(u).remove(0);
dfs(graph, current, res);
}
res.add(u);
}
}
Complexity Analysis¶
- Time Complexity:
O(?) - Space Complexity:
O(?)
Approach¶
Detailed explanation of the approach will be added here