如何加速用Java编写的递归方法

时间:2013-12-30 14:15:08

标签: java performance recursion

这是LeetCode的问题,我使用C ++解决它,但是当我使用与Java相同类型的方法时,它会返回超出时间限制的错误。有谁知道原因?

问题在于:

  

将排序数组转换为二进制搜索树。给定一个数组,其中元素按升序排序,将其转换为高度平衡的BST。

这是我用Java编写的解决方案:

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode sortedArrayToBST(int[] num) {
        if(num.length == 0) {
            return null;
        } else {
            return sub(num, 0, num.length-1);
        }
    }

    public TreeNode sub(int[] num, int start, int end) {
        int indexRoot = (start+end+1) / 2;
        TreeNode root = new TreeNode(num[indexRoot]);

        if(indexRoot > start) {
            root.left = sub(num, 0, indexRoot-1);
        }
        if(indexRoot < end) {
            root.right = sub(num, indexRoot+1, end);
        }

        return root;
    }
}

有什么方法可以加快速度吗?感谢。

2 个答案:

答案 0 :(得分:0)

组织自己的堆栈 - 成对的索引。而不是逐步调用过程使用堆栈放置对并调用sub()作为最顶层的。

while (stack of pairs processing is not finished) {
  //get next pair and process the pair
  sub(next pair);
}

public TreeNode sub(int[] num, int start, int end) {
    int indexRoot = (start+end+1) / 2;
    TreeNode root = new TreeNode(num[indexRoot]);

    if(indexRoot > start) {
        root.left = addToStack(num, 0, indexRoot-1);
    }
    if(indexRoot < end) {
        root.right = addToStack(num, indexRoot+1, end);
    }

    return root;
}

答案 1 :(得分:0)

代码中只有一个拼写错误。正确的应该如下。

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode sortedArrayToBST(int[] num) {
        if(num.length == 0) {
            return null;
        } else {
            return sub(num, 0, num.length-1);
        }
    }

    public TreeNode sub(int[] num, int start, int end) {
        int indexRoot = (start+end+1) / 2;
        TreeNode root = new TreeNode(num[indexRoot]);

        if(indexRoot > start) {
            root.left = sub(num, start, indexRoot-1);
        }
        if(indexRoot < end) {
            root.right = sub(num, indexRoot+1, end);
        }

        return root;
    }
}