如果一个帮助栈在问题解决后几乎完全删除,空间复杂度是多少?
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删除后,如果解决数据库日志报错问题