J(算法)中的O(nlogn)

时间:2016-05-11 21:52:45

标签: javascript algorithm

以下功能:

function solution(K, A) {
    var counter=0;
    for (var i=0;i<A.length;i++) {
        for (var j=i;j<A.length;j++) {
            if (A[i]+A[j]===K) {
              if (i===j)
               counter++;
              else
               counter+=2;  
            }
        }   
    }
    return counter;
}

找到数组A中对的元素的数量,它们的总和为K.I s是O(n ^ 2/2)?是否有另一种算法用{实现上述内容{1}}?

2 个答案:

答案 0 :(得分:2)

是的,由于两个for循环,您发布的解决方案具有O(n^2)复杂性。实际上,您可以使用O(n)来解决map中的问题,function solution(k, arr){ var map = {}; for (var i=0; i < arr.length ; i++){ var tmp = k - arr[i]; if (temp > 0 && map[tmp] == 1) console.log("Found the pair :", temp, arr[i]); else map[arr[i]] = 1; } } 只是JavaScript中的关联数组。

myObj = {

    1: 
    [
                {
                "name"  : "ringo",
                "passed": true,
                "level" : 2
                },
                {
                "name"  : "paul",
                "passed": true,
                "level" : 3
                },
                {
                "name"  : "john",
                "passed": false,
                "level" : 4
                },
                {
                "name"  : "george",
                "passed": true,
                "level" : 1
                },
    ],

    2: 
    [
                {
                "name"  : "ringo",
                "passed": true,
                "level" : 2
                },
                {
                "name"  : "paul",
                "passed": true,
                "level" : 3
                },
                {
                "name"  : "john",
                "passed": false,
                "level" : 4
                },
                {
                "name"  : "george",
                "passed": true,
                "level" : 1
                },
    ],

答案 1 :(得分:0)

如果要查找在O(nlog n)中具有和K的元素对,则应创建一个新数组,在该数组中存储已作为参数传递的数组的已排序版本,然后执行以下操作:

var i = 0;
var j = A.length - 1;
while(i < j) {

    if(A[i] + A[j] == k) {

        counter++;
        ++i;
        --j;
    }
    else
        if(A[i] + A[j] < k) {

            ++i;
        } 
        else
            ++j;
}

现在排序采用 O(nlogn)和上面的代码 O(n),这使得 O(nlogn)。< / p>