leetcode654_最大二叉树
题目链接:https://leetcode-cn.com/problems/maximum-binary-tree/
模拟题
class Solution {
private int maxIndex(int[] nums) {
int tmp = Integer.MIN_VALUE,idx =0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] > tmp) {
tmp = nums[i];
idx = i;
}
}
return idx;
}
public TreeNode constructMaximumBinaryTree(int[] nums) {
int len = nums.length;
if(len == 0) return null;
int idx = maxIndex(nums);
TreeNode root = new TreeNode(nums[idx]);
int[] leftNums={},rightNums={};
if(idx > 0) leftNums = Arrays.copyOfRange(nums, 0, idx);
if(idx < len - 1) rightNums = Arrays.copyOfRange(nums, idx+1, len) ;
root.left = constructMaximumBinaryTree(leftNums);
root.right = constructMaximumBinaryTree(rightNums);
return root;
}
}
但其实是思维的问题,Arrays.copyOfRange(nums, 0, idx);耗费了大量的时间,直接传递左右下标即可:
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
if(nums.length == 0) return null;
return traversal(nums, 0, nums.length);
}
private TreeNode traversal(int[] nums, int left, int right) {
if(right <= left) {
return null;
}
else if(left+1 == right) {
TreeNode root = new TreeNode(nums[left]);
return root;
}
else {
int maxValue = nums[left], maxIdx = left;
for(int i = left+1; i < right; i++) {
if(nums[i] > maxValue) {
maxValue = nums[i];
maxIdx = i;
}
}
TreeNode root = new TreeNode(maxValue);
root.left = traversal(nums, left, maxIdx);
root.right = traversal(nums, maxIdx+1, right);
return root;
}
}
}
这样就击败了88%的人,快多了。