问题描述
我一直在尝试通过在线学习和解决 leetcode 问题来更好地掌握数据结构和算法。我还试图了解如何计算算法的时间复杂度,以找出如何改进它们。我刚刚完成了 LeetCode 问题:Third Maximum Number。我认为我的解决方案没有太优化,因为它只比 45% 的解决方案快。但我认为它仍然在线性 O(n) 时间内运行。这是我的代码:
我的计算是否正确?我的算法在 O(n) 中运行吗?谢谢大家的帮助!
解决方法
首先,毫无疑问,你的算法的复杂度是O(n)
。但是,这并不是您代码的确切复杂性,您可以改进几个地方。名单如下:
-
set
操作的复杂度为O(1)
,但在更坏的情况下(当您在每次插入时都发生哈希冲突时),复杂度会提高到O(n)
。因此,您的list(set(nums))
的整体复杂性可能是O(n^2)
。 -
要找到第三个最大数字,您需要运行
O(n)
循环三次。显然,Big-O
表示法是O(n)
,但实际上您正在为3 * n
运行。
您可以考虑在这方面进行改进。请记住,尽管由于代码中的优化,具有相同 Big-O
复杂度的两种算法可能具有不同的实际运行时间。我进一步思考了这个问题,发现这个问题可以通过对 n
数字只运行一个循环来解决。这是我的 C++
代码:
class Solution {
public:
int thirdMax(vector<int>& nums) {
const long long int MIN = ((long long int) 1 << 60) * (-1);
int sz = nums.size();
long long int mx1,mx2,mx3;
mx1 = mx2 = mx3 = MIN;
for(int n : nums) {
if(mx1 <= n) {
if(mx1 == n) continue;
mx3 = mx2;
mx2 = mx1;
mx1 = n;
}
else if (mx2 <= n) {
if(mx2 == n) continue;
mx3 = mx2;
mx2 = n;
}
else if (mx3 < n) mx3 = n;
}
if(mx3 == MIN || mx2 == MIN) return mx1;
return mx3;
}
};
此代码的运行时间为 4 ms
,比针对此问题的 C++ 在线提交的 97.13%
更快。