问题描述

给定一个数组,数组中的数不重复,且均大于1。要求使用数组中的数构建二叉树,每个数字可以被重复使用,除了叶子节点,每个节点的值等于其子节点的乘积,求构建二叉树的数量,返回的结果mod 10**9 + 7

Example 1:

Input: A = [2, 4] Output: 3

Explanation: We can make these trees: [2], [4], [4, 2, 2]

Example 2:

Input: A = [2, 4, 5, 10] Output: 7

Explanation: We can make these trees: [2], [4], [5], [10], [4, 2, 2], [10, 2, 5], [10, 5, 2].

原题链接: https://leetcode.com/problems/binary-trees-with-factors/

分析

符合条件的二叉树分为两种情况,一种是单个节节点组成的二叉树, 没有子节点,共有A.length种情况; 另外一种情况是多个节点组成的二叉树,节点的值为children节点值的乘积。第一种情况非常简单,不需要讨论,第二种情况稍微有些复杂,不过我们可以想到:

如果 a = b * c等式成立,那么由a为父节点组成的二叉树的数量 = 由b为父节点组成的二叉树 * 由c为父节点组成的二叉树 * 2 (左右节点交换位置)

因此对于元素a为root 对应的二叉树数量,我们需要统计出所有b和c所对应的二叉树数量(b < a, c < a)。为了达到这个目的,我们可以使用hashmap存储数据中以任意元素为root所对应的二叉树数量,那么在计算a节点对应的二叉树数量,只需要查询hashmap得到b和c对应的二叉树数量即可,其次为了保证值较小的b和c先于a计算,我们需要对array进行sort,通过bottom to top这种迭代计算得到后续的元素的二叉树数量。

实现

public int umFactoredBinaryTrees(int[] A){
int mod = 1000000007;
Arrays.sort(A);
//key是二叉树root 对应数组中每个值,value是对应二叉树的数量
Map<Integer, Long> map = new HashMap();
Long result = 0;
for(int m = 0; i < A.length; m++){
long cnt = 1; //第一种二叉树情况
int a = A[m];
for(Integer b : map.keySet()){
if(a % b == 0 && map.containsKey(a/b)){
cnt += map.get(b) * map.get(a/b);
}
}
map.put(num, cnt);
result = (result + cnt) % mod;
}
return (int) result;
}

空间复杂度O(n),时间复杂度O(n^2)

Leetcode823 : 因子二叉树问题的更多相关文章

  1. [Swift]LeetCode823. 带因子的二叉树 | Binary Trees With Factors

    Given an array of unique integers, each integer is strictly greater than 1. We make a binary tree us ...

  2. Java实现 LeetCode 823 带因子的二叉树(DP)

    823. 带因子的二叉树 给出一个含有不重复整数元素的数组,每个整数均大于 1. 我们用这些整数来构建二叉树,每个整数可以使用任意次数. 其中:每个非叶结点的值应等于它的两个子结点的值的乘积. 满足条 ...

  3. [LeetCode] Binary Trees With Factors 带因子的二叉树

    Given an array of unique integers, each integer is strictly greater than 1. We make a binary tree us ...

  4. 二叉树学习笔记之经典平衡二叉树(AVL树)

    二叉查找树(BSTree)中进行查找.插入和删除操作的时间复杂度都是O(h),其中h为树的高度.BST的高度直接影响到操作实现的性能,最坏情况下,二叉查找树会退化成一个单链表,比如插入的节点序列本身就 ...

  5. 【数据结构】建立和平衡AVL二叉树

    一步一步写平衡二叉树(AVL树) 原文地址:http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html 我添加了一些内容,以充实整个算 ...

  6. vijosP1388 二叉树数

    vijosP1388 二叉树数 链接:https://vijos.org/p/1388 [思路] Catalan数.根据公式h=C(2n,n)/(n+1)计算.首先化简为 (n+i)/i的积(1< ...

  7. 二叉树,平衡树,红黑树,B~/B+树汇总

    二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操作的时候,都不需要彻底重建原始的索引树 ...

  8. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  9. 二叉树,AVL树和红黑树

    为了接下来能更好的学习TreeMap和TreeSet,讲解一下二叉树,AVL树和红黑树. 1. 二叉查找树 2. AVL树 2.1. 树旋转 2.1.1. 左旋和右旋 2.1.2. 左左,右右,左右, ...

随机推荐

  1. 关于for循环中使用setTimeout

    我们先来简单了解一下setTimeout延时器的运行机制.setTimeout会先将回调函数放到等待队列中,等待区域内其他主程序执行完毕后,按时间顺序先进先出执行回调函数.本质上是作用域的问题. 因此 ...

  2. C# 轮流展示照片

    代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u ...

  3. 【JZOJ2019.10.07】模拟赛C组

    \(T1\) 题目描述&大意 贝西牛在每个点左右撞来撞去,不能出去 的情况下能活动(达到)的空间总共有多少? 思路 部分过程为: 反正就是能撞的撞 代码:

  4. ios图片适配问题

    在不同的系统中显示不同的图片 代码优化 抽取一个分类

  5. js表达式和语句趣味题讲解与技术分享

    技术分享 问题1 { a: 1 } + 1 // ? ({ a: 1 }) + 1 // ? 1 + { a: 1 } // ? 答案 { a: 1 } + 1 // 1 ({ a: 1 }) + 1 ...

  6. “copy” 与 “=“赋值

    前拷贝  与  赋值 >>> a = {1:'one',2:'two',3:'three'}>>> b = a.copy()>>> c = a&g ...

  7. JavaScript的内存模型

    引言 在我们的前端日常工作中,无时无刻不在进行着变量的声明和赋值,你是否也曾碰到过变量声明报错或变量被污染的问题,如果你跟笔者一样碰到过,那么我们应该暂时停下来好好思考问题发生的原因以及如何采取相应的 ...

  8. 机器学习-Python 01

    机器学习中最常用最流行的语言工具现阶段应该是Python, 这篇文章主要介绍一些常用的Python语法知识.本篇博文适合那些有其他语言基础的程序员们,如果一点基础都没有,我建议先跳过.博主以前是做移动 ...

  9. Python网络爬虫入门实战(爬取最近7天的天气以及最高/最低气温)

    _ 前言 本文文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Bo_wen   最近两天学习了一下python,并自己写了一个 ...

  10. ARTS-S EN0001-In tech race with China, US universities may lose a vital edge

    原文 The U.S. is still out in front of global rivals when it comes to innovation, but American univers ...