liuxuhelloworld's notebook

题目链接

https://leetcode-cn.com/problems/unique-binary-search-trees/

解答过程

这个题目我觉得就很像智力题了,或者说纯算法题,如果纠结于具体的BST形态就想错方向了。将从1到n的n个节点排布成BST,重点是将问题抽象,从整棵树的角度考虑。固定一个节点k作为跟节点,所有小于跟节点k的节点组成左子树,所有大于跟节点k的节点组成右子树,那么以k为跟节点的BST有多少个?显然是S(k-1)*S(n-k)。k的取值有从1到n的n种可能,所以:

	public int numTrees(int n) {
		assert n >= 1 && n <= 19;

		int[] num = new int[n+1];
		num[0] = 1;

		for (int i = 1; i <= n; i++) {
			for (int j = 0; j <= i-1; j++) {
				num[i] += num[j] * num[i-1-j];
			}
		}

		return num[n];
	}

我印象中这个数在数学中是有专门的名称的,叫卡塔尔数,有时间真想重学高等数学。