
暴力递归建树,复杂度O(n2) 2ms,单调栈,复杂度O(n) 12ms。 只能说数据太弱了
抽象的来看一个数组按照该方式构建一棵树过程:
显然每个节点都是在某个开区间内的最大值,而如果左边界较小(相对于右边界)那么该节点就是左边界的右子树,反之该节点就是右边界的左子树
此时维护一个递减的单调栈
所有节点进栈前的栈顶元素是该节点左边最近的比它大的节点,该节点有可能是栈顶节点的右子树,存在两种情况:
对于一个节点的左子树的情况也是差不多的
当一个节点入栈的过程中,比它小的节点都会弹出栈,而最后一个弹出栈的就是该节点与栈顶元素之间的最大值,此时该节点是作为一个区间的较小边界,所以这个最大值是它的左子树
最后只要输出栈中最大的元素即可
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
Deque<Integer> dq = new LinkedList<>();
TreeNode[] tree = new TreeNode[nums.length];
for(int i = 0; i < nums.length; i++){
tree[i] = new TreeNode(nums[i]);
while(dq.size() != 0 && nums[i] > nums[dq.getLast()])
tree[i].left = tree[dq.removeLast()];
if(dq.size() != 0)
tree[dq.getLast()].right = tree[i];
dq.addLast(i);
}
return tree[dq.getFirst()];
}
}