代码之家  ›  专栏  ›  技术社区  ›  motioncity

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

  •  0
  • motioncity  · 技术社区  · 7 年前

    我正在努力 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)解决方案,因为最坏的情况是我们遍历整个数组,但我不确定。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Tim Biegeleisen    7 年前

    您的函数似乎使用了某种分而治之的方法。对于每个呼叫,它都会发出一个 O(n) 传递输入数组,将大于或小于某个轴的值压缩为两个单独的数组。然后,它对适当的子数组进行递归调用。在一般情况下,它会将输入数组的大小除以2,直到只对大小为1的数组进行递归调用,这是基本情况。

    我估计这个函数的运行时间是 O(n*lgn) ,这是一种典型的分治算法。每次通话都会 O(n) 工作,通常会有 O(lgn) 递归调用数。