【问题标题】:How is my solution slower than given sample solution?我的解决方案比给定的示例解决方案慢多少?
【发布时间】:2021-10-26 10:44:52
【问题描述】:

这是 2021 年 8 月 26 日的 Leet Codeproblem。 我提交了几个解决方案,其中这个是最好的。然而,它花了 7 毫秒,当我看到示例 0 毫秒的解决方案时,我震惊地发现解决方案有多复杂以及有多少条件检查。


问题(已编辑)

给定一串逗号分隔值preorder,如果它是一个正确的二叉树的前序遍历序列化,则返回true

保证字符串中每个逗号分隔的值必须是整数或代表空指针的字符'#'


所以我把这个贴在discussion:

我的解决方案(耗时 7 毫秒)

class Solution
{
public:
    bool isValidSerialization(string preorder)
    {
        int c = 1;
        const int L = preorder.length();
        bool state = true;
        for (int i = 0; i < L; i++)
        {
            if (state)
            {
                state = false;
                if (!c)
                    return false;
                if (preorder[i] != '#')
                    c++;
                else
                    c--;
            }
            else
                state = preorder[i] == ',';
        }
        return !c;
    }
};

示例 0 ms 解决方案

class Solution {
public:
    bool isValidSerialization(string pre) {
        stack<int> s;
        if(pre.length()==1 && pre[0]=='#'){
            return true;
        }
        string num = "";
        for(int i=0; i<pre.length(); i++){
            if(pre[i]==','){
                continue;
            }
            if(s.empty() && i>0){
                return false;
            }
            if(pre[i]=='#'){
                if(s.empty()){return false;}
                s.top()--;
                while(!s.empty() && s.top()==0){
                    s.pop();
                    if(!s.empty()){s.top()--;}
                    if(!s.empty() && s.top()<0){
                        return false;
                    }
                }
            }
            else{
                int j=i;
                while(j<pre.size() && pre[j]!=','){
                    j++;
                }
                i = j-1;
                s.push(2);
            }
            //cout << i << " -> " << s.size() << endl; 
        }
        if(s.size()>0){
            //cout << s.size() << endl;
            return false;
        }
        return true;
    }
};

当我的程序没有复杂对象和条件语句较少时,它是如何变慢的??


由于我没有希望在那里得到任何回应,所以我在这里发布了它。

【问题讨论】:

  • 您多久运行这两个程序以获得可靠的平均运行时间?你能确定使用了哪些编译器标志并且它们对于两个程序都是相同的吗?这些网站上的时间通常会有所不同,我不会担心。
  • 这是一个 leet 代码提交。我刚刚做了我的解决方案。在统计部分,我看到了一个示例 0 ms 解决方案。所以实际上我从未运行过示例解决方案。
  • 我在 leetcode 上看不到问题(请在问题中包含问题陈述),但似乎示例解决方案会及早检测到一些错误并停在那里,您总是执行 for 循环完全。
  • 一个问题不应该需要链接才能理解。特别是不需要登录的链接。 Edit问题,并保留链接作为参考。
  • 自己测量。您可能会发现 leetcode 歪曲了示例解决方案的性能。

标签: c++ algorithm time


【解决方案1】:

Leetcode 可以在不同状态的不同机器上运行不同的解决方案 - 因此即使提交相同的代码,您也会得到不同的结果。有时 +100 毫秒,认为 c++ 时间比解释语言的变化少。编译器标志在常见问题解答中给出。 leetcode上关于时间测量不一致的讨论:onetwo,你可以找到更多。

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多