DFS + TreeMap (TLE)
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 47 48 49 50 51 52 53 54 55 56 57 58
| class Solution { private static class TreeNode { private final int index; private final List<TreeNode> children;
public TreeNode(int index) { this.index = index; this.children = new ArrayList<>(); } }
public int[] smallestMissingValueSubtree(int[] parents, int[] nums) { TreeNode[] nodes = new TreeNode[parents.length]; for (int i = 0; i < parents.length; i++) { TreeNode node = new TreeNode(i); nodes[i] = node; }
for (int i = 1; i < parents.length; i++) { TreeNode node = nodes[i]; TreeNode parentNode = nodes[parents[i]]; parentNode.children.add(node); }
int[] res = new int[parents.length]; dfs(nodes[0], nums, res); return res; }
private TreeSet<Integer> dfs(TreeNode node, int[] nums, int[] res) { if (node.children.isEmpty()) { TreeSet<Integer> treeSet = new TreeSet<>(); for (int i = 1; i <= 100000; i++) { treeSet.add(i); } treeSet.remove(nums[node.index]); res[node.index] = treeSet.higher(0); return treeSet; }
List<TreeSet<Integer>> treeSetList = new ArrayList<>(node.children.size()); for (int i = 0; i < node.children.size(); i++) { treeSetList.add(dfs(node.children.get(i), nums, res)); }
TreeSet<Integer> treeSet = treeSetList.get(0); for (int i = 1; i < treeSetList.size(); i++) { treeSet.retainAll(treeSetList.get(i)); }
treeSet.remove(nums[node.index]); res[node.index] = treeSet.higher(0);
return treeSet; } }
|
DFS
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 47 48 49 50 51
| class Solution { public int[] smallestMissingValueSubtree(int[] parents, int[] nums) { int[] res = new int[parents.length]; Arrays.fill(res, 1);
int startNodeIndex = -1; for (int i = 0; i < nums.length; i++) { if (nums[i] == 1) { startNodeIndex = i; break; } }
if (startNodeIndex == -1) { return res; }
List<List<Integer>> childrenList = new ArrayList<>(parents.length); for (int i = 0; i < parents.length; i++) { childrenList.add(new ArrayList<>()); }
for (int i = 1; i < parents.length; i++) { childrenList.get(parents[i]).add(i); }
Set<Integer> geneticValueSet = new HashSet<>(); int missingGeneticValue = 2; int nodeIndex = startNodeIndex; while (nodeIndex != -1) { dfs(nodeIndex, childrenList, nums, geneticValueSet); while (geneticValueSet.contains(missingGeneticValue)) { missingGeneticValue++; } res[nodeIndex] = missingGeneticValue; nodeIndex = parents[nodeIndex]; }
return res; }
private void dfs(int nodeIndex, List<List<Integer>> childrenList, int[] nums, Set<Integer> geneticValueSet) { geneticValueSet.add(nums[nodeIndex]); for (int childIndex : childrenList.get(nodeIndex)) { if (!geneticValueSet.contains(nums[childIndex])) { dfs(childIndex, childrenList, nums, geneticValueSet); } } } }
|
References
2003. Smallest Missing Genetic Value in Each Subtree