我正在尝试this problem on LeetCode,以下是我提出的解决方案:
var findKthLargest = function(nums, k) {
//var tmp = nums.slice();
var iteration = 0;
while (iteration < k) {
var max = -Infinity;
for (var i = 0; i < nums.length; i++) {
var cut;
if (nums[i] > max) {
max = nums[i];
cut = i;
}
}
nums.splice(cut, 1);
iteration++;
}
return max;
};
现在,我相信这是一个 log n 解决方案,因为我基本上正在做的是删除数组中的最大值,这会减少我的比较次数。但是,它只占59%的JavaScript解决方案,这让我觉得我可能没有正确的复杂性。
答案 0 :(得分:2)
k
循环有while()
次迭代(我认为,这些循环会更加惯用地写为for(var j = 0; j < k; j++)
)。
第一次迭代然后执行n
循环的for
次迭代,nums.splice(cut, 1)
为O(n)
,因为它必须从cut
移位所有数组元素到n
。 O(2n)
与O(n)
相同,因为在big-O计算中会忽略常数因子。
第二次迭代执行n-1
次迭代。这也是O(n)
因为我们忽略了大O符号的不断调整。 splice
也是如此。
所以最终的结果是它是O(k * n)
,因为你有外部循环的k
次迭代,而内部循环都是O(n)
。最糟糕的情况是k >= n
,O(n^2)