我想迭代一个数组,找到差异为2的所有对
这是我到目前为止所做的:
var numberOfCases = 5;
var diff = 2;
var input = [1,5,3,4,2];
getPossiblepairs(input);
function getPossiblepairs(input){
for(cmp in input){
for(number in input){
if((input[cmp] - input[number]) == diff){
console.log("("+input[cmp]+","+input[number]+")");
}
}
}
}
这样可行,但我仍然感到内疚,使用两个for循环,因为bigO是 O(n ^ 2)这是唯一的方法吗?
答案 0 :(得分:6)
您可以在 O(n log n)中执行此操作。对数组进行排序,然后一次性完成。找出当前元素与下两个元素之间的差异,如果一个元素相差2,则打印出该元素。
答案 1 :(得分:4)
这应该与 n log n 复杂性一起使用:
function getPossiblepairs(input, diff){
// Create a copy of the original array, so it is not affected by the next operation
var sortedInput = input.slice();
// Sort the array
sortedInput.sort();
// Iterate through the array, starting from the 0th element
for (var i=0, n=sortedInput.length; i<n; i++){
firstNumber = sortedInput[i];
// Iterate through the array, starting from the (i+1)th element
for (var j=i+1; j<n && sortedInput[j] <= firstNumber + diff; j++){
secondNumber = sortedInput[j];
// if it matches, then log it!
if (secondNumber - firstNumber == diff){
console.log('(' + firstNumber + ', ' + secondNumber + ')');
}
}
}
}
有关阵列复制的详细信息,请参阅this post。
有关使用和测试,请参阅:http://jsfiddle.net/gycjup5u/2/
答案 2 :(得分:3)
答案 3 :(得分:2)
您可以对每个元素使用indexOf()
方法来确定数组是否包含大于diff
给出的元素:
function getPossiblePairs(input, diff) {
for(i in input) {
var n = input.indexOf(input[i] + diff);
if(n != -1) {
console.log("(" + input[i] + "," + input[n] + ")");
}
}
}
getPossiblePairs(input, diff);