1. 程式人生 > 其它 >leetcode654_最大二叉樹

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%的人,快多了。