微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我是否正确计算了解决方案的时间复杂度?

如何解决我是否正确计算了解决方案的时间复杂度?

我一直在尝试通过在线学习和解决 leetcode 问题来更好地掌握数据结构和算法。我还试图了解如何计算算法的时间复杂度,以找出如何改进它们。我刚刚完成了 LeetCode 问题:Third Maximum Number。我认为我的解决方案没有太优化,因为它只比 45% 的解决方案快。但我认为它仍然在线性 O(n) 时间内运行。这是我的代码

My work for my calculations for the time complexity of my algorithm

我的计算是否正确?我的算法在 O(n) 中运行吗?谢谢大家的帮助!

解决方法

首先,毫无疑问,你的算法的复杂度是O(n)。但是,这并不是您代码的确切复杂性,您可以改进几个地方。名单如下:

  1. set 操作的复杂度为 O(1),但在更坏的情况下(当您在每次插入时都发生哈希冲突时),复杂度会提高到 O(n)。因此,您的 list(set(nums)) 的整体复杂性可能是 O(n^2)

  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% 更快。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。