带因子的二叉树【LC823】
给出一个含有不重复整数元素的数组
arr
,每个整数arr[i]
均大于 1。用这些整数来构建二叉树,每个整数可以使用任意次数。其中:每个非叶结点的值应等于它的两个子结点的值的乘积。
满足条件的二叉树一共有多少个?答案可能很大,返回 对
109 + 7
取余 的结果。
class Solution { public static final int MOD = (int)(1e9 + 7); public int numFactoredBinaryTrees(int[] arr) { Arrays.sort(arr); long res = 0L; int n = arr.length; long[] dp = new long[n]; Map<Integer,Integer> index = new HashMap<>(); for (int i = 0; i < n; i++){ index.put(arr[i], i); } Arrays.fill(dp, 1L); for (int i = 0; i < n; i++){ for (int j = 0; j < i; j++){ if (arr[i] % arr[j] == 0 && index.containsKey(arr[i] / arr[j])){ dp[i] += dp[j] * dp[index.get(arr[i] / arr[j])] ; } } res += dp[i]; } return (int)(res % MOD) ; } }