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)
但这需要额外的内存(对于更大的数组,它需要很多...)
有什么其他方式没有存储任何额外的?
如果你的输入数组是唯一的,为什么不从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)
| 归档时间: |
|
| 查看次数: |
704 次 |
| 最近记录: |