卡特兰数当年大二时候就知道了其在行走路线问题上面的应用,后来发现其还有更多的应用场景,而且最近做LeetCode也碰见了不少这样的问题,特此总结一番。
LeetCode上跟卡特兰数相关的问题有如下四道:
96. Unique Binary Search Trees
95. Unique Binary Search Trees II
这两道题题干差不多,就是1~n总共n个数,将其构建成一个BST数,问总共有多少种不同的构建方法(96题),输出所有情况(95题)
241. Different Ways to Add Parentheses
给一个运算公式如:2-1-1,将括号加到其中,并输出所有可能加括号后的结果,如上面这个就输出:[2,0] ( 解释:(2-(1-1)) = 2,((2-1)-1) = 0)
312.Burst Balloons
一排气球,每个气球上面都有一个数字nums,扎破一个气球i之后,得到nums[i-1]*nums[i]*nums[i+1],问怎么个扎破顺序使得最后得到的总和最大。
这些题背后的思想或者用法都跟卡特兰数有关。对于卡特兰数的问题,总结如下:
- 输出所有情况的问题:95,241两道题。一定需要用到递归,是一个卡特兰数级别的复杂度算法。
- 输出一个最值结果,如最大最小:312题。因为卡特兰数,用递归的时候会有大量的重复情况,这种情况下一定需要用到动态规划。而卡特兰数相关问题的动态规划,一定是一个 O(n3) 的算法。
- 还有最简单的一种情况,就是输出情况个数:95题。这种情况下,就可以直接套用卡特兰数的通项公式。
找出所有情况的问题
如上所示,要找出所有情况,一定是用到了递归。
对于95题
vector<TreeNode*> generateT(int i,int j){