两个嵌套的/循环没有重复的对

ElS*_*jko 1 javascript algorithm loops permutation

我们有阵列:

var arr = [0,1,2];
Run Code Online (Sandbox Code Playgroud)

和循环:

for ( var i=0; i<arr.length; i++ ) {
    for ( var j=0; j<arr.length; j++ ) {
        if ( arr[i] == arr[j] ) continue;
        console.log(arr[i], arr[j]);
    }
}
Run Code Online (Sandbox Code Playgroud)

并输出:

0,1 //a--|
0,2 //b--|--|
1,0 //a--|  |
1,2 //c-----|--|
2,0 //b-----|  |
2,1 //c--------|
Run Code Online (Sandbox Code Playgroud)

我们可以看到有重复的对(在注释中a,b和c出现两次)

我们摆脱重复对的唯一方法是在某种记忆中存储已经"匹配"的对吗?

var mem = {};

for ( var i=0; i<arr.length; i++ ) {
    for ( var j=0; j<arr.length; j++ ) {
        var left = i;
        var right = j;
        if ( left > right ) {
            var temp = right;
            right = left;
            left = temp;
        }

        if ( arr[i] == arr[j] || mem[arr[left]+","+arr[right]] ) continue;

        console.log(arr[i], arr[j]);
        mem[arr[left]+","+arr[right]] = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

并输出:

0,1
0,2
1,2
Run Code Online (Sandbox Code Playgroud)

但这需要额外的内存(对于更大的数组,它需要很多...)

有什么其他方式没有存储任何额外的?

Ami*_*n J 6

如果你的输入数组是唯一的,为什么不从i + 1开始你的j

for ( var i=0; i<arr.length; i++ ) {
    for ( var j= i + 1 ; j<arr.length; j++ ) {
        console.log(arr[i], arr[j]);
    }
}
Run Code Online (Sandbox Code Playgroud)