小编Fai*_*zan的帖子

将数组划分为子数组,以便没有子数组包含重复元素

我有32个数字组成的数组[1,2,3,4,4,4,4,5,5,5,5,5,6,6,7,7,7,7,7,8,9,10, 10,11,12,13,13,14,14,15,16,17,17]

我想将此数组划分为8个子数组,每个子数组的大小为4,这样子数组就不会有重复的元素。

我可以通过几种方式做到这一点?生成所有排列和单个随机排列的最佳解决方案是什么。子数组的顺序无关紧要。每个子数组中元素的顺序也没有。

对于我的原始问题,我不需要生成所有排列。每次运行程序时,我只需要生成一个随机排列。

我的方法是使用Fisher-Yates算法随机地对数组进行混洗,并不断对其进行改组,直到获得所有8个没有重复元素的子数组。当然,这不是最好的方法。

作为解决方案的一部分,我对数组进行了混洗,并从此混洗后的数组开始向子数组一个接一个地添加元素。如果任何子数组已经有一个数字,那么我会不断从混洗的数组中跳过元素,直到达到一个不是我的子数组的数字。在某些情况下,此方法将失败。

我尝试过的伪代码

let shuffledArray = shuffle(originalArray);
let subArrays = [];
for (let i = 0; i < 8; i++) {
    subArrays[i] = [];
    for (let j = 0; j < 32; j++) {
        if (!subArrays[i].contains(shuffledArray[j]) && !shuffledArray[j].used) {
            subArrays[i].push(shuffledArray[j])
            shuffledArray[j].used = true;
        }
        if (subArrays[i].length == 4) {
            break;
        }
    }
}

 if subArrays has any sub array such that it has duplicate elements then repeat above steps
 else we have generated a random …
Run Code Online (Sandbox Code Playgroud)

arrays algorithm permutation combinatorics

5
推荐指数
1
解决办法
398
查看次数

标签 统计

algorithm ×1

arrays ×1

combinatorics ×1

permutation ×1