javascript - 排列:推送功能不起作用,JavaScript O(n*n!) 运行时

标签 javascript push permutation

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

我有这段代码,运行时间正常,但似乎推送功能不起作用,我不知道为什么这一切总的来说都是有意义的

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)
}

最佳答案

您将同一个数组多次插入 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 中有效计算排列的示例。

关于javascript - 排列:推送功能不起作用,JavaScript O(n*n!) 运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67012811/

相关文章:

iphone - 无法连接到生产 Apple 推送通知服务器

python - 排列,但有一些数字按顺序排列

python - Pandas:列向量的成对串联

java - 有没有更好的方法来锁定主滚动条而不将其隐藏在 GWT 中?

javascript - 改变 <select> 的背景颜色

javascript - 如何在 AngularJs 中向未登录的用户隐藏某些 URL(页面)?

git - 你的分支领先于 'origin/master' 1 次提交

JBoss Errai,我应该用它替换我所有的 GWT-RPC 客户端调用吗?

sql - 匹配两个数据集中列的排列

javascript - 如何在不使用 WinjS 库的情况下在通用 Windows 应用程序中添加后退按钮事件?