这个的时间复杂度是多少,如何使其为0(n)?

时间:2019-07-22 23:03:37

标签: javascript performance time-complexity

Leetcode问题Third Maximum Number正在寻求O(n)解决方案。

这是我的解决方案,这的时间复杂度是多少?以及如何使其为0(n)?我以为reduce实际上是0(n),但也许不是吗? sort的时间复杂度是多少?

var thirdMax = function(nums) {

    var arr = nums.reduce((unique, element) =>{
        return unique.includes(element) ? unique : [...unique, element]
    }, []);     
    arr.sort(function(a, b){return b-a});
    console.log(arr);

    if(arr.length < 3){
        return arr[0];
    } else {
        return arr[2]
    }
};

谢谢!

1 个答案:

答案 0 :(得分:1)

reduce遍历输入数组,并检查另一个数组中是否有任何元素匹配,且复杂度为O(N^2)(最坏的情况是,必须对每个其他项进行检查)

排序数组的复杂度为O(N log N)

因此,总的来说,最坏情况下的复杂度是O(N^2)

我会在跟踪3个持久变量的同时进行迭代-到目前为止找到的最高数字,第二高和第三高。因为看起来他们也想禁止重复项被计数,所以请使用Set来跟踪到目前为止已看到的数字。 Set.hasO(1),因此无需担心其他复杂性:

var thirdMax = function(nums) {
  let highest = -Infinity;
  let secondHighest = -Infinity;
  let thirdHighest = -Infinity;
  const numsSeen = new Set();
  nums.forEach((num) => {
    if (numsSeen.has(num)) {
      return;
    }
    numsSeen.add(num);
    
    if (num > highest) {
      [highest, secondHighest, thirdHighest] = [num, highest, secondHighest];
    } else if (num > secondHighest) {
      [secondHighest, thirdHighest] = [num, secondHighest];
    } else if (num > thirdHighest) {
      thirdHighest = num;
    }
  });
  return thirdHighest === -Infinity
  ? highest
  : thirdHighest;
};

console.log(
  thirdMax([1, 2, 3]),
  thirdMax([1, 2, 3, 4]),
  thirdMax([2,2,3,1])
);