Description
There is a list composed by sets. If two sets have the same elements, merge them. In the end, there are several sets left.
Have you met this question in a real interview?
Example
Example 1:
Input :list = [[1,2,3],[3,9,7],[4,5,10]]
Output:2 .
Explanation:There are 2 sets of [1,2,3,9,7] and [4,5,10] left.
Example 2:
Input:list = [[1],[1,2,3],[4],[8,7,4,5]]
Output :2
Explanation:There are 2 sets of [1,2,3] and [4,5,7,8] left.
public class Solution { /** * @param sets: Initial set list * @return: The final number of sets */ public int setUnion(int[][] sets) { // Write your code here if (sets == null || sets.length == 0) { return 0; } Map<Integer, Integer> parentsMap = new HashMap<>(); int numSets = 0; // init the map for (int[] set : sets) { for (int node : set) { parentsMap.put(node, node); } } numSets = parentsMap.size(); // union-find for (int[] set : sets) { for (int i = 1; i < set.length; i++) { int p1 = find(set[i - 1], parentsMap); int p2 = find(set[i], parentsMap); if (p1 != p2) { parentsMap.put(p1, p2); numSets--; } } } return numSets; } private int find(int node, Map<Integer, Integer> parentsMap) { int root = node; while (root != parentsMap.get(root)) { root = parentsMap.get(root); } // path compression while (node != root) { int parent = parentsMap.get(node); parentsMap.put(node, root); node = parent; } return root; } }
No comments:
Post a Comment