我在网上找到了这个函数的时间复杂度O(n)?

时间:2018-03-27 01:12:02

标签: javascript time-complexity

我正在尝试this problem on LeetCode,以下是我在网上找到的解决方案:



//  use quick select
var findKthLargest = function(nums, k) {
    var smaller = [];
    var larger = [];
    var pivot = nums[parseInt(nums.length/2)];
    var pivotCnt = 0;

    for (var i = 0; i < nums.length; i++) {
        var num = nums[i];      
  
        if(num > pivot) {
            larger.push(num);
        }
        else if(num < pivot) {
            smaller.push(num);
        }
        else {
            pivotCnt++;
        }
    }
  
    if (k <= larger.length) { // if larger includes k
        return findKthLargest(larger, k);
    }
    else if (k - larger.length - pivotCnt <= 0) { // k is part of pivot
        return pivot;
    }
    else { // if smaller inclues k
        return findKthLargest(smaller, k - larger.length - pivotCnt);
    }
};
&#13;
&#13;
&#13;

现在我相信这是一个O(n)解决方案,因为最坏的情况是我们遍历整个数组,但我不确定。

1 个答案:

答案 0 :(得分:1)

您的功能似乎正在使用某种分而治之的方法。对于每个调用,它会对输入数组进行单O(n)次传递,将大于和小于某个数据透视表的存储值转换为两个单独的数组。然后,它在适当的子阵列上进行递归调用。在一般情况下,它会将输入数组的大小除以2,直到只对大小为1的数组进行递归调用,这是基本情况。

我估计这个函数的运行时间是O(n*lgn),这对于分而治之的算法来说是典型的。每个调用O(n)都有效,并且通常会有O(lgn)个递归调用。