作为学校项目的一部分,我需要编写一个函数,该函数将使用整数N并返回数组{0,1,...,N-1}的每个排列的二维数组。该声明看起来像公共(public)静态int [] [] permutations(int N)。

http://www.usna.edu/Users/math/wdj/book/node156.html中描述的算法是我决定实现此算法的方式。

我用ArrayLists的数组和ArrayLists以及ArrayLists的ArrayLists搏斗了好一阵子,但到目前为止,我一直很沮丧,尤其是尝试将2d ArrayList转换为2d数组时。

所以我用javascript写的。这有效:

function allPermutations(N) {
    // base case
    if (N == 2) return [[0,1], [1,0]];
    else {
        // start with all permutations of previous degree
        var permutations = allPermutations(N-1);

        // copy each permutation N times
        for (var i = permutations.length*N-1; i >= 0; i--) {
            if (i % N == 0) continue;
            permutations.splice(Math.floor(i/N), 0, permutations[Math.floor(i/N)].slice(0));
        }

        // "weave" next number in
        for (var i = 0, j = N-1, d = -1; i < permutations.length; i++) {
            // insert number N-1 at index j
            permutations[i].splice(j, 0, N-1);

            // index j is  N-1, N-2, N-3, ... , 1, 0; then 0, 1, 2, ... N-1; then N-1, N-2, etc.
            j += d;
            // at beginning or end of the row, switch weave direction
            if (j < 0 || j >= N) {
                d *= -1;
                j += d;
            }
        }
        return permutations;
    }
}

那么将其移植到Java的最佳策略是什么?我可以只使用原始数组吗?我需要一个ArrayLists数组吗?还是ArrayLists的ArrayList?还是还有其他更好的数据类型?无论使用什么,我都需要能够将其转换回原始数组的数组。

也许有更好的算法可以简化我的工作...

预先感谢您的建议!

最佳答案

如您所知,预先排列的数量(它是N!),并且您也想/必须返回一个int[][],我将直接使用数组。您可以一开始就以正确的尺寸声明它,并在最后将其返回。因此,您完全不必担心以后再进行转换。

10-06 02:20