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;
    }
}
相关推荐
老鼠只爱大米5 分钟前
LeetCode经典算法面试题 #215:数组中的第K个最大元素(快速选择、堆排序、计数排序等多种实现方案详解)
算法·leetcode·堆排序·快速选择·topk·数组中的第k个最大元素
2301_8166512212 分钟前
C++中的享元模式变体
开发语言·c++·算法
逆境不可逃14 分钟前
LeetCode 热题 100 之 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
m0_5832031315 分钟前
C++中的访问者模式变体
开发语言·c++·算法
浅念-22 分钟前
C ++ 智能指针
c语言·开发语言·数据结构·c++·经验分享·笔记·算法
不染尘.23 分钟前
最小生成树算法
开发语言·数据结构·c++·算法·图论
Klong.k36 分钟前
判断是不是素数题目
数据结构·算法
QQsuccess37 分钟前
AI全体系保姆级详讲——第一部分:了解AI基本定义
人工智能·算法
_日拱一卒40 分钟前
LeetCode:移动零
算法·leetcode·职场和发展
A923A1 小时前
【洛谷刷题 | 第四天】
算法·前缀和·贪心·洛谷·差分