大厂算法面试之 leetcode 精讲 17. 栈
大厂算法面试之 leetcode 精讲 17.栈
视频讲解(高效学习):点击学习
目录:
Stack 的特点:先进后出(FILO)
使用场景:十进制转 2 进制 函数调用堆栈
js 里没有栈,但是可以用数组模拟
栈的时间复杂度:入栈和出栈
O(1)
,查找O(n)
20. 有效的括号 (easy)
方法 1.栈
思路:首先如果字符串能组成有效的括号,则长度一定是偶数,我们可以遍历字符串,遇到左括号则暂存,期待后面有右括号可以和它匹配,如果遇到右括号则检查是否能和最晚暂存的做括号匹配。这就和栈这种数据结构先进后出的特性相吻合了。所以我们可以准备一个栈存放括号对,遍历字符串的时候,如果遇到左括号入栈,遇到右括号则判断右括号是否能和栈顶元素匹配,在循环结束的时候还要判断栈是否为空,如果不为空,则不是有效括号匹配的字符串
复杂度分析:时间复杂度
O(n)
,空间复杂度O(n)
,n 为字符串的长度
js:
Java:
232. 用栈实现队列 (easy)
方法 1.栈
思路:这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系。在 push 数据的时候,只要数据放进输入栈就好,但在 pop 的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。最后如果进栈和出栈都为空的话,说明模拟的队列为空了。
复杂度分析:push 时间复杂度
O(1)
,pop 时间复杂度为O(n)
,因为 pop 的时候,输出栈为空,则把输入栈所有的元素加入输出栈。空间复杂度O(n)
,两个栈空间
js:
Java:
155. 最小栈 (easy)
思路:定义两个栈 stack 和 min_stack,stack 正常 push,min_stack 只会 push 需要入栈和栈顶中较小的元素。getMin 返回 min_stack 栈顶元素,top 返回 stack 栈顶元素。
复杂度:所有操作的时间复杂度是
O(1)
js:
java:
946. 验证栈序列 (medium)
思路:用栈模拟出栈入栈的过程,当 popped 中 index 指向的位置的元素和 stack 栈顶的元素一致时,出栈 并且
index++
,最后判断 stack 是否为空复杂度:时间复杂度
O(n)
,pushed 中的元素入栈出栈一次,空间复杂度O(n)
,栈的大小
js:
java:
445. 两数相加 II (medium)
思路:将两个链表的节点都推入栈中,然后不断出栈,计算每个位置的值和进位,串连成一个新的链表
复杂度:时间复杂度
O(max(m,n))
,m,n 是两个链表的长度,空间复杂度O(m+n)
js:
java:
682. 棒球比赛 (easy)
复杂度:时间复杂度
O(n)
,空间复杂度O(n)
js:
java:
评论