654. Maximum Binary Tree
654. Maximum Binary Tree
654. Maximum Binary Tree
题目大意:
意思就是给你一组数,先选一个最大的作为根,这个数左边的数组作为左子树,右边的数组作为右子树,重复上一步。
读完就知道是递归了。
这个题真尼玛恶心,对JavaScript的友好度简直为0,用Js的可以直接放弃了。
1 function TreeNode(val) { 2 this.val = val 3 this.left = this.right = null 4 } 5 6 var constructMaximumBinaryTree = function(nums) { 7 var ans = findmaxvalue(nums, 0, nums.length-1) 8 return ans 9 } 10 11 function findmaxvalue(nums, l, r) 12 { 13 if(r < l) { 14 return null; 15 } 16 var max = nums[l]; 17 var maxpos = l; 18 for(var i=l+1;i<=r;i++) 19 { 20 if(nums[i] > max) { 21 maxpos = i 22 max = nums[i] 23 } 24 25 } 26 var root = new TreeNode(max) 27 root.left = findmaxvalue(nums, l, maxpos-1) 28 root.right = findmaxvalue(nums, maxpos+1, r) 29 return root; 30 }
时间复杂度应该是小于n2的,但是我不知道这种方法的复杂度到底是多少,我猜是x(x可能是nlogn,我也不太清楚)。
如果用线段树的话,复杂度应该是x'(n < x' < x < n2)
我提交了一下发现是错的,理论输出是一个数组,我tm甚至用BFS搜索了一下二叉树,加入到一个数组里了,然后我本来push为null的元素,测评机输出为一个数组???????气的一笔,随便找了份代码交了。
BFS代码:
var ans = findmaxvalue(nums, 0, nums.length-1) var res = [] var queue = [] queue.push(ans) while(queue.length != 0) { var t = queue.shift() if(t != null) { res.push(t.val) if(t.left != null || t.right != null) { queue.push(t.left) queue.push(t.right) } } else { res.push(null) } }