823. Binary Trees With Factors
T: O(n^2)
S: O(n)
```java
class Solution {
private static final int MOD = 1000000007;
public int numFactoredBinaryTrees(int[] arr) {
Arrays.sort(arr); // num_root = num_left(x) * num_right(root/x)
Map<Integer, Long> map = new HashMap<>();
for (int a : arr) {
map.put(a, 1l);
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < i; j++) {
int root = arr[i];
int left = arr[j];
int right = root/left;
// if (root == left) { // 如果已經找到根 root 一樣大的因數, 代表不用往下找了(??)
// break;
// }
if (root%left == 0 && map.containsKey(right)) {
map.put(root, (map.get(root) + map.get(left)*map.get(right)) % MOD );
}
}
}
long sum = 0l;
for (long count : map.values()) {
sum += count;
}
return (int)(sum%MOD);
}
}
/**
T: O(n^2)
S: O(n)
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < i; j++) {
這是為了找對應的因數, 所以跑兩層loop 數字去%數字
if (root%left == 0
-> 找到 left 是因數(factor), 而且 root/left 有在 map裏面
代表找到左右子樹了,
root 的count + left相乘right -> 就會是新的count
但如何確定這個left right 不會太早算呢?因為left right都有可能是 root
這就是為什麼要先排序sort, 所以我們是從小的數字先去找的
所以整個結果由小到大產生, 這樣就不會影響到之後的結果
最後把每個root的 count 加起來, 就是答案
2 1
4 1
2 4
2 4
map(4, map(4) + map(2)*map(2) = 1 + 1 = 2)
2 1
4 2
add all result -> 1+2 = 3
也就是說
4 本身就1了
/\
2 2. -> 再加上這個結果 -> 1*1 然後 add back to map(4)的map key上
*/
```
Last updated