子树组合,BST query
Java 带泛型的 Collections 确实是可以放 null 的, 比如 Queue, List...
正确的思路是,给定 n 个 node 之后,直接看 inorder 数组【1, 2, 3, 4 .. n-1, n】
那么选任意位置的元素为 root,都可以建出来一个 valid BST,左子树为 index 左边的 subarray,右子树为 index 右边的 subarray.
于是这就变成了一个利用递归结构的“组合”问题了,解的数量左右相乘。inorder 是 BST 的灵魂啊。
public class Solution {
public int numTrees(int n) {
if(n <= 2) return n;
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= n; i++){
for(int j = 0; j <= i - 1; j++){
int leftCount = j;
int rightCount = i - 1 - j;
dp[i] += dp[leftCount] * dp[rightCount];
}
}
return dp[n];
}
}Java 带泛型的 Collections 确实是可以放 null 的, 比如 Queue, List...
这个解法我很喜欢,类似于 sliding window maximum 一样,维护一个大小为 k 的 sliding window,在树上做 inorder traversal,每当 window size == k 但是新 node 值比 head 的值更接近于 target 的时候,就给替换掉。当后来发现新来的 node 不比 head 更接近于 target 的时候,就可以返回结果了,而且因为 LinkedList 继承了 List,连类型转换都不需要。
时间复杂度 O(n) ,还带 early termination,非常简洁高效的解法,比我写的那个速度快,而且简洁明了。
Last updated