【问题标题】:Permutation: Push function not working, JavaScript O(n*n!) runtime排列:推送功能不起作用,JavaScript O(n*n!) 运行时
【发布时间】:2021-04-08 22:42:27
【问题描述】:

手头的问题是: 给定一个由不同整数组成的数组,返回所有可能的排列。您可以按任意顺序返回答案。

我的这段代码运行时间还可以,但推送功能似乎不起作用,我不知道为什么这一切都有意义

Example 1:
Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

Constraints: 
1 <= nums.length <= 6
-10 <= nums[i] <= 10
All the integers of nums are unique.


var permute = function(nums) {
    if (nums == null) {
        return []
    }
    return getPermutations(nums);
};

function getPermutations(arr) {
    var set = {}
    var size = factorial(arr.length)
        var result = []
    while (Object.keys(set).length < size) {
        for (var i = 0; i < arr.length && result.length < size; i++) {
            for (var j = arr.length - 1; j >= 0 && result.length < size; j--) {
                if (!set[arr]) {
                    set[arr] = 1
                    console.log(arr) //clearly see the permutations printed 
                    result.push(arr) //why is this not working...
                }
                arr = swap(arr,i,j)
            }
        }
    }
    return result
}

function swap(arr,i,j) {
    var tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
    return arr
}

function factorial(n) {
    if (n == 0 || n == 1) { 
        return 1
    }
    return n*factorial(n-1)
}

【问题讨论】:

    标签: javascript push permutation


    【解决方案1】:

    您将同一个数组多次推送到result 数组中。

    您可以通过在推送之前创建 arr 数组的副本来解决此问题。
    (所以它之后的代码不能再次改变数组)

    因此,您可以使用以下示例之一,而不是 result.push(arr)

    // using splash operator
    result.push([...arr]);
    
    // Array#slice()
    result.push(arr.slice());
    
    // Array.from()
    result.push(Array.from(arr));
    
    // etc...
    

    工作示例:

    var permute = function(nums) {
        if (nums == null) {
            return []
        }
        return getPermutations(nums);
    };
    
    function getPermutations(arr) {
        var set = {}
        var size = factorial(arr.length)
            var result = []
        while (Object.keys(set).length < size) {
            for (var i = 0; i < arr.length && result.length < size; i++) {
                for (var j = arr.length - 1; j >= 0 && result.length < size; j--) {
                    if (!set[arr]) {
                        set[arr] = 1
                        console.log(arr) //clearly see the permutations printed
                        result.push([...arr]) //why is this not working...
                    }
                    arr = swap(arr,i,j)
                }
            }
        }
        return result
    }
    
    function swap(arr,i,j) {
        var tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
        return arr
    }
    
    function factorial(n) {
        if (n == 0 || n == 1) { 
            return 1
        }
        return n*factorial(n-1)
    }
    
    console.log(permute([1,2,3]));

    This question 也值得一读,它包含很多关于如何在 javascript 中有效计算排列的示例。

    【讨论】:

    • 谢谢!我用了它的切片,它起作用了!
    猜你喜欢
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2016-12-23
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多