2023-08-29 LeetCode(带因子的二叉树)

这篇具有很好参考价值的文章主要介绍了2023-08-29 LeetCode(带因子的二叉树)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2023-08-29每日一题

一、题目编号

823. 带因子的二叉树

二、题目链接

点击跳转到题目位置

三、题目描述

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

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

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

示例 1:
2023-08-29 LeetCode(带因子的二叉树),LeetCode每日一题,leetcode,算法,数据结构
示例 2:
2023-08-29 LeetCode(带因子的二叉树),LeetCode每日一题,leetcode,算法,数据结构
提示:

  • 1 <= arr.length <= 1000
  • 2 <= arr[i] <= 109
  • arr 中的所有值 互不相同

四、解题代码

class Solution {
    const int mod = 1e9 + 7;
public:
    int numFactoredBinaryTrees(vector<int>& arr) {
        sort(arr.begin(), arr.end());
        int n = arr.size();
        vector<long long> dp(n);
        long long res = 0;
        for(int i = 0; i < n; ++i){
            dp[i] = 1;
            int left = 0;
            int right = i - 1;
            while(left <= right){
                while(right >= left && (long long)arr[left] * arr[right] > arr[i]){
                    --right;
                }
                if(right >= left && (long 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;
                    }
                }
                ++left;
            }
            res = (res + dp[i]) % mod;
        }
    return res;
    }
};

五、解题思路

(1) 使用动态规划来解决问题。首先将arr按照从小到大来进行排序。设置状态,dp[i]表示以arr数组下标为i的结点为根结点的树有多少种。

(2) 利用双指针,left 等于 0, right 等于 i - 1, i为数组遍历到的下标。然后如果arr[left] * arr[right] 等于 arr[i] 的话,如果left等于right,那么dp[i] 应当加上 dp[left] 乘以 dp[right]。如果left 不等于 right,dp[i] 应当加上dp[left] 乘以 dp[right] 乘以 2。

(3) 因为结果较大,不要忘记进行取模运算。

(4) 最后返回结果即可。文章来源地址https://www.toymoban.com/news/detail-683243.html

到了这里,关于2023-08-29 LeetCode(带因子的二叉树)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ​LeetCode解法汇总823. 带因子的二叉树

    https://github.com/September26/java-algorithms 给出一个含有不重复整数元素的数组  arr  ,每个整数  arr[i]  均大于 1。 用这些整数来构建二叉树,每个整数可以使用任意次数。其中:每个非叶结点的值应等于它的两个子结点的值的乘积。 满足条件的二叉树一共有多少个?答案可能很

    2024年02月10日
    浏览(25)
  • 每日一题——对称的二叉树

    题目 给定一棵二叉树,判断其是否是自身的镜像(即:是否对称) 例如: 下面这棵二叉树是对称的 下面这棵二叉树不对称。 数据范围:节点数满足 0≤n≤1000,节点上的值满足 ∣val∣≤1000 要求:空间复杂度 O(n),时间复杂度 O(n) 参数说明:二叉树类,二叉树序列化是通过

    2024年02月13日
    浏览(31)
  • leetcode 823. 带因子的二叉树(dp+双指针+Long类型)

    题目表述 给出一个含有不重复整数元素的数组 arr ,每个整数 arr[i] 均大于 1。 用这些整数来构建二叉树,每个整数可以使用任意次数。其中:每个非叶结点的值应等于它的两个子结点的值的乘积。 满足条件的二叉树一共有多少个?答案可能很大,返回 对 1 0 9 + 7 10^9+7 1 0 9

    2024年02月10日
    浏览(29)
  • 2023-08-29力扣每日一题

    链接: 823. 带因子的二叉树 题意: 用给的数字建二叉树,要求父节点是子节点的乘积 解: 乐了 1500ms+30MB //注释版120ms+18MB 实际代码: 限制: 1 = arr.length = 1000 2 = arr[i] = 109 arr 中的所有值 互不相同

    2024年02月11日
    浏览(22)
  • Leetcode每日一题:1448. 统计二叉树中好节点的数目(2023.8.25 C++)

    目录 1448. 统计二叉树中好节点的数目 题目描述: 实现代码与解析: dfs 原理思路:         给你一棵根为  root  的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。 示例 1: 示例 2: 示例

    2024年02月11日
    浏览(28)
  • 2023-07-29 LeetCode每日一题(环形链表)

    点击跳转到题目位置 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:p

    2024年02月15日
    浏览(31)
  • 823.带因子的二叉树

    题目 示例 提示 思路 题目中要的是 父亲节点的val = 左孩子.val * 右孩子的val , 根据题目的意思,单节点也算 c = b*a ,所有看看能不能枚举c =》是可以枚举的,将原有数组进行排序( 升序 ) 当枚举到下标的i的时候,有多少种呢?这里有一个dp数组来做存储 定义dp数组 long[]

    2024年02月10日
    浏览(35)
  • 2023-08-28 LeetCode每日一题(插入区间)

    点击跳转到题目位置 给你一个 无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 示例 1: 示例 2: 示例 3: 示例 4: 示例 5: 提示: 0 = intervals.length = 10 4 interval

    2024年02月11日
    浏览(35)
  • 2023-08-27 LeetCode每日一题(合并区间)

    点击跳转到题目位置 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 示例 2: 提示: 1 = intervals.length = 10 4 intervals[i].length == 2 0 = s

    2024年02月10日
    浏览(34)
  • 2023-07-08 LeetCode每日一题(三数之和)

    点击跳转到题目位置 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请 你返回所有和为 0 且不重复的三元组。 **注意:**答案中不可以包含重复的三元组。 提示: 3 = nums.length = 3000 -10 5

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包