我对包含不同数字的整数数组的所有排列的解决方案的时间复杂度

时间:2019-02-06 00:22:13

标签: java arrays algorithm recursion permutation

我的代码的时间复杂度是多少?我通过www.leetcode.com运行了它,这是最佳选择。我认为它是O(n * n!)。首先,我认为它是O(n ^ 2 * n!):因为我们进行了n次递归调用,所以额外增加了n个。但是,只有对permute()的第一次调用才占主导地位,而自n以来,其余的都比其他方法相形见!!是>>>(n-1)!

非常感谢!

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        return permute(nums, nums.length - 1);
    }

    private List<List<Integer>> permute(int[] nums, int n) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if(n < 0) {
            List<Integer> permutation = new ArrayList<Integer>();
            result.add(permutation);
            return result;
        }

        // below returns (n-1)! results of size n-1 each
        List<List<Integer>> prefixes = permute(nums, n-1); 
        for(List<Integer> prefix : prefixes) {
            List<List<Integer>> permutations = insert(nums[n], prefix);
            result.addAll(permutations);
        }
        return result;
    }

    // O(n^2) worst case when size of list is n-1
    private List<List<Integer>> insert(int num, List<Integer> list) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        for(int i = 0; i <= list.size(); i++) {
            List<Integer> clone = new ArrayList<Integer>();
            clone.addAll(list);
            clone.add(i, num);
            result.add(clone);
        }
        return result;
    }

}

1 个答案:

答案 0 :(得分:1)

我认为这个问题可能更适合https://codereview.stackexchange.com/