我正在尝试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;
现在我相信这是一个O(n)解决方案,因为最坏的情况是我们遍历整个数组,但我不确定。
答案 0 :(得分:1)
您的功能似乎正在使用某种分而治之的方法。对于每个调用,它会对输入数组进行单O(n)
次传递,将大于和小于某个数据透视表的存储值转换为两个单独的数组。然后,它在适当的子阵列上进行递归调用。在一般情况下,它会将输入数组的大小除以2,直到只对大小为1的数组进行递归调用,这是基本情况。
我估计这个函数的运行时间是O(n*lgn)
,这对于分而治之的算法来说是典型的。每个调用O(n)
都有效,并且通常会有O(lgn)
个递归调用。