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]
}
};
谢谢!
答案 0 :(得分:1)
reduce
遍历输入数组,并检查另一个数组中是否有任何元素匹配,且复杂度为O(N^2)
(最坏的情况是,必须对每个其他项进行检查)
排序数组的复杂度为O(N log N)
。
因此,总的来说,最坏情况下的复杂度是O(N^2)
。
我会在跟踪3个持久变量的同时进行迭代-到目前为止找到的最高数字,第二高和第三高。因为看起来他们也想禁止重复项被计数,所以请使用Set来跟踪到目前为止已看到的数字。 Set.has
是O(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])
);