如果一个帮助栈在问题解决后几乎完全删除,空间复杂度是多少?

Posted

技术标签:

【中文标题】如果一个帮助栈在问题解决后几乎完全删除,空间复杂度是多少?【英文标题】:If a helper stack almost completely deletes after problem is solved, what is the space complexity? 【发布时间】:2022-01-22 06:10:21 【问题描述】:

我正在解决“有效括号”的 leetcode 问题 (#20),我遇到了这个看起来非常有效的解决方案 - 它使用了一个辅助堆栈,如果括号全部有效,它通常最终会完全为空。

我想知道空间复杂度是否会在 O(N) 左右或更低?我很困惑,主要是因为帮助程序堆栈通常在最后被删除,但我知道这不会是最坏的情况,所以我不太确定。

这是代码:

class Solution 
    
public boolean isValid(String s) 
    
    Stack<Character> stack = new Stack<Character>();
    
    for (char c : s.toCharArray()) 
        if (c == '(')
            stack.push(')');
        else if (c == '')
            stack.push('');
        else if (c == '[')
            stack.push(']');
        else if (stack.isEmpty() || stack.pop() != c)
            return false;
    
    
    return stack.isEmpty();
    
    

谢谢!

【问题讨论】:

如果最坏的情况是一个充满(的字符串,那么你的堆栈大小将是N(字符串的长度)。所以它的空间复杂度是O(N)。 谢谢!这很有意义。 顺便说一下,s.toCharArray() 本身就是 O(N),因为您正在创建一个包含 N 个字符的新数组。 哦,所以时间复杂度是 2 * O(N) --> O(N) ? 【参考方案1】:

我很困惑主要是因为帮助程序堆栈通常在最后被删除

这不是最后的堆栈,而是堆栈处理过程中的内容。想象一个字符串((((((()))))))(一个有效的括号序列)。即使堆栈最后是空的,它也会在解决方案的中途包含 N/2 个字符,即 O(N/2),在渐近复杂度中是 O(N)。

还要记住,通常最好的情况不是很有用。我想最好的情况是 ()()() 在任何时候你只有 1 个字符在堆栈中。但是因为我们很少关心最好的情况,所以我们想要最坏的或预期的情况,即 O(N)。

所以答案就是 O(N)。

【讨论】:

以上是关于如果一个帮助栈在问题解决后几乎完全删除,空间复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章

时间复杂度空间复杂度

达梦数据库表空间文件系统层面rm删除后,如果解决数据库日志报错问题

Confluence 6 删除一个空间

解决Mac时光机器备份需要很大空间和Mac删除文件后空间没有释放问题

ubuntu16.04操作练习&问题解决

具有完全相同名称空间的不明确引用