我正在尝试做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);
    }
};





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

最佳答案

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

我估计此函数的运行时间为O(n*lgn),这对于分而治之算法是典型的。每个调用确实可以执行O(n),并且通常会有O(lgn)个递归调用。

07-26 08:12