【发布时间】: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 歪曲了示例解决方案的性能。