leetcode 823 带因子的二叉树

用动态规划

如果两个节点值不同,要乘2,因为两个节点可以互换位置

dp[i] = dp[left] * dp[right] * 2

如果相同

dp[i] = dp[left] * dp[right]

java 复制代码
class Solution {
    public int numFactoredBinaryTrees(int[] arr) {
        Arrays.sort(arr);
        int n = arr.length;
        long[] dp = new long[n];
        long res = 0, mod = 1000000007;
        for (int i = 0; i < n; i++) {
            dp[i] = 1;
            for (int left = 0, right = i - 1; left <= right; left++) {
                while (right >= left && (long) arr[left] * arr[right] > arr[i]) {
                    right--;
                }
                if (right >= left && (long) arr[left] * arr[right] == arr[i]) {
                    if (right != left) {
                        dp[i] = (dp[i] + dp[left] * dp[right] * 2) % mod;
                    } else {
                        dp[i] = (dp[i] + dp[left] * dp[right]) % mod;
                    }
                }
            }
            res = (res + dp[i]) % mod;
        }
        return (int) res;
    }
}
相关推荐
张同学的IT技术日记39 分钟前
【奇妙的数据结构世界】 用经典例题对数组进行全面分析 | C++
算法
queenlll44 分钟前
Codeforces Round 1043 (Div. 3)
算法
摸鱼一级选手1 小时前
十大经典 Java 算法解析与应用
java·算法·排序算法
Ldawn_AI3 小时前
4+ 图论高级算法
算法·深度优先·图论
Xの哲學3 小时前
Linux PCI 子系统:工作原理与实现机制深度分析
linux·网络·算法·架构·边缘计算
NuyoahC5 小时前
笔试——Day46
c++·算法·笔试
Keying,,,,5 小时前
力扣hot100 | 图论 | 200. 岛屿数量、994. 腐烂的橘子、207. 课程表、208. 实现 Trie (前缀树)
算法·leetcode·图论
cwplh6 小时前
Codeforces1043 A至F 题解
算法
楼田莉子7 小时前
C++算法学习专题:滑动窗口
开发语言·数据结构·c++·学习·算法·leetcode
2501_924731117 小时前
智慧矿山误报率↓83%!陌讯多模态融合算法在矿用设备监控的落地优化
人工智能·算法·目标检测·视觉检测