文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给你一个数组 nums 表示 1 到 n 的一个排列。
我们按照元素在 nums 中的顺序依次插入一个初始为空的二叉查找树(BST)。
请你统计将 nums 重新排序后,统计满足如下条件的方案数:重排后得到的二叉查找树与 nums 原本数字顺序得到的二叉查找树相同。

比方说,给你 nums = [2,1,3],我们得到一棵 2 为根,1 为左孩子,3 为右孩子的树。
数组 [2,3,1] 也能得到相同的 BST,但 [3,2,1] 会得到一棵不同的 BST 。

请你返回重排 nums 后,与原数组 nums 得到相同二叉查找树的方案数

由于答案可能会很大,请将结果对 10^9 + 7 取余数。

示例 1:

输入:nums = [2,1,3]
输出:1
解释:我们将 nums 重排, [2,3,1] 能得到相同的 BST 。
没有其他得到相同 BST 的方案了。

示例 2:

输入:nums = [3,4,5,1,2]
输出:5
解释:下面 5 个数组会得到相同的 BST:
[3,1,2,4,5]
[3,1,4,2,5]
[3,1,4,5,2]
[3,4,1,2,5]
[3,4,1,5,2]

示例 3:

输入:nums = [1,2,3]
输出:0
解释:没有别的排列顺序能得到相同的 BST 。

示例 4:

输入:nums = [3,1,2,5,4,6]
输出:19示例  5:
输入:nums = [9,4,2,1,3,6,5,7,8,14,11,10,12,13,16,15,17,18]
输出:216212978
解释:得到相同 BST 的方案数是 3216212999。
将它对 10^9 + 7 取余后得到 216212978。提示:
1 <= nums.length <= 1000
1 <= nums[i] <= nums.length
nums 中所有数 互不相同 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-ways-to-reorder-array-to-get-same-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 根节点是数组第一个数
  • 然后分为左右两个子树,左右子树之间的顺序不乱就可以
  • 假设左子树 L 长度 nL,右子树 R 长度 nR,存在方案数为 CnL+nRnL∗f(L)∗f(R)C_{nL+nR}^{nL}*f(L)*f(R)CnL+nRnL​∗f(L)∗f(R)
class Solution {vector<vector<int>> C;int mod = 1e9+7;
public:int numOfWays(vector<int>& nums) {int n = nums.size();C = vector<vector<int>> (n+1, vector<int>(n+1, 0));C[1][0] = 1, C[1][1] = 1;// DP 求解组合数for(int i = 2, j; i <= n; ++i){for(j = 0; j <= i; ++j){if(j==0 || j==i)C[i][j] = 1;else{C[i][j] = (C[i-1][j-1] + C[i-1][j])%mod;}}}return (dfs(nums)-1)%mod;}long long dfs(vector<int> &nums){if(nums.size() <= 1)return 1;int root = nums[0], n = nums.size();vector<int> l, r;for(int num : nums){if(num < root)l.push_back(num);else if(num > root)r.push_back(num);}long long nL = dfs(l), nR = dfs(r);return (((C[n-1][l.size()]*nL)%mod)*nR)%mod;}
};

424 ms 172.5 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 1569. 将子数组重新排序得到同一个二叉查找树的方案数(DP)相关推荐

  1. LeetCode 1793. 好子数组的最大分数(单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums (下标从 0 开始)和一个整数 k . 一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i+1 ...

  2. LeetCode 918. 环形子数组的最大和(前缀和+单调队列)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和. 在此处,环形数组意味着数组的末端将会与开头相连呈环状. (形式上,当0 & ...

  3. LeetCode 1695. 删除子数组的最大得分(前缀和+哈希+双指针)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组. 删除子数组的 得分 就是子数组各元素之 和 . 返回 只删除一个 子数组可 ...

  4. LeetCode 1063. 有效子数组的数目(单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个整数数组 A,返回满足下面条件的 非空.连续 子数组的数目: 子数组中,最左侧的元素不大于其他元素. 示例 1: 输入:[1,4,2,5,3] 输 ...

  5. LeetCode 795. 区间子数组个数

    给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R). 求连续.非空且其中最大元素满足大于等于L 小于等于R的子数组个数. 例如 : 输入: A = [2, 1, 4, 3] ...

  6. LeetCode动态规划 环形子数组的最大和

    给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和. 此外,子数组最多只能包含固定缓冲区 A 中的每个元素一次. 思路 本道题需要分类成两种情况,题目答案为以下两种情况的较大 ...

  7. 【LeetCode】643. 子数组最大平均数 I

    class Solution1 {/*643. 子数组最大平均数 I给你一个由 n 个元素组成的整数数组 nums 和一个整数 k .请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数 ...

  8. leetcode算法题--子数组按位或操作

    原题链接:https://leetcode-cn.com/problems/bitwise-ors-of-subarrays/ 动态规划 dp[i]表示A[:i]的所有子数组按位或的结果 状态转移 d ...

  9. 动态规划——环形子数组的最大和(Leetcode 918)

    题目选自Leetcode 918. 环形子数组的最大和 非常难懂的题目,但是本质其实就是求最大子序列和,思路 题目描述: 解题思路: 两边的和怎么求呢 ,是不是就是用全部的和减去中间那一块的,中间那一 ...

最新文章

  1. 2015级C++第14周程序阅读 STL中的简单容器和迭代器
  2. Android系统默认Home应用程序(Launcher)的启动过程源码分析
  3. Android adt 初步理解和分析(三)
  4. 电脑常用工具(阅读代码、文件搜索、思维导图、图片处理、文件比较、流程图、桌面效率工具)
  5. 计算机与操作系统小结
  6. zookeeper的名词复盘-集群角色
  7. matlab-robtics学习笔记
  8. CSDN论坛上的一道算法题
  9. 深入剖析C++中的string类
  10. 【B/S】HTML总结
  11. python邮件模块_Python收发邮件模块,用,来,发送,接收
  12. android 刷机文件怎么打开,安卓手机怎么刷机
  13. 使用C#存储数据时excel有Microsoft切换到了wps时的引用
  14. 2011美剧季终/剧终时间表。
  15. 如何装计算机网络驱动,网卡驱动怎么安装,手把手教你电脑网卡驱动怎么安装...
  16. 吴恩达《深度学习专项》笔记+代码实战(六):改进梯度下降算法(mini-batch, Momentum, Adam)
  17. 《非常网管:网络管理从入门到精通(修订版)》一1.1 计算机网络基础
  18. 树莓派3 搭建tensorflow并进行物体识别
  19. Restful风格的springMVC配搭ajax请求的小例子
  20. visio用方向键无法移动图标的解决方法

热门文章

  1. iphone屏幕突然变暗_如果你的iPhone屏幕突然变暗,可以这样解决
  2. baidumap vue 判断范围_vue 数据渲染
  3. eclipse的java帮助文档_java在Eclipse中文apidoc帮助文档导入.doc
  4. Linux中一些 不是很常用的配置修改
  5. mybatis基础学习3---特殊sql语句(备忘)
  6. 分享Db4o的便捷封装类源码
  7. DIV Scroll属性
  8. Qt中的Q_OBJECT
  9. C语言 ,嵌入式 ,c++,数据结构 面试题目(4)
  10. 简单分析STM32和51的区别