日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/5 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1569. 将子数组重新排序得到同一个二叉查找树的方案数(DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。