这个函数的时间复杂度是O(log n)吗?

时间:2018-03-26 21:50:45

标签: javascript algorithm time-complexity

我正在尝试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解决方案,这让我觉得我可能没有正确的复杂性。

1 个答案:

答案 0 :(得分:2)

k循环有while()次迭代(我认为,这些循环会更加惯用地写为for(var j = 0; j < k; j++))。

第一次迭代然后执行n循环的for次迭代,nums.splice(cut, 1)O(n),因为它必须从cut移位所有数组元素到nO(2n)O(n)相同,因为在big-O计算中会忽略常数因子。

第二次迭代执行n-1次迭代。这也是O(n)因为我们忽略了大O符号的不断调整。 splice也是如此。

所以最终的结果是它是O(k * n),因为你有外部循环的k次迭代,而内部循环都是O(n)。最糟糕的情况是k >= nO(n^2)