【每日一题Day309】LC823带因子的二叉树 | dp

简介: 【每日一题Day309】LC823带因子的二叉树 | dp

带因子的二叉树【LC823】

给出一个含有不重复整数元素的数组 arr ,每个整数 arr[i] 均大于 1。

用这些整数来构建二叉树,每个整数可以使用任意次数。其中:每个非叶结点的值应等于它的两个子结点的值的乘积。

满足条件的二叉树一共有多少个?答案可能很大,返回  109 + 7 取余 的结果。

image.png

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) ;
    }
}

image.png

目录
相关文章
|
6月前
【每日一题Day242】LC1262可被三整除的最大和 | 贪心 dp
【每日一题Day242】LC1262可被三整除的最大和 | 贪心 dp
50 0
|
6月前
|
人工智能 BI
【每日一题Day267】LC834树中距离之和 | 换根dp
【每日一题Day267】LC834树中距离之和 | 换根dp
43 0
|
6月前
【每日一题Day185】LC1027最长等差数列 | dp
【每日一题Day185】LC1027最长等差数列 | dp
44 0
|
6月前
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
54 0
|
6月前
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
54 0
|
6月前
【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心
【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心
38 0
|
6月前
【每日一题Day289】LC1749任意子数组和的绝对值的最大值 | dp
【每日一题Day289】LC1749任意子数组和的绝对值的最大值 | dp
43 0
|
6月前
|
索引
【每日一题Day183】LC1187使数组严格递增 | dp
【每日一题Day183】LC1187使数组严格递增 | dp
42 0
|
6月前
|
机器学习/深度学习
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
52 0
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
|
6月前
【每日一题Day265】LC979在二叉树中分配硬币 | 树形dp
【每日一题Day265】LC979在二叉树中分配硬币 | 树形dp
55 0