[英雄星球七月集训LeetCode解题日报] 第14日 栈
日报
题目
一、 1614. 括号的最大嵌套深度
链接: 1614. 括号的最大嵌套深度
1. 题目描述
2. 思路分析
- 因为题目给的必是合法串,那用栈判断最多有几个未被关闭的’('即可。
3. 代码实现
class Solution:
def maxDepth(self, s: str) -> int:
stack = 0
ans = 0
for c in s:
if c == '(':
stack += 1
ans = max(ans,stack)
elif c == ')':
stack -= 1
return ans
二、 剑指 Offer 06. 从尾到头打印链表
1. 题目描述
2. 思路分析
- 看到题目第一时间想递归,发现数据范围是一万会爆深度。
- 那用栈存一下再出来就行,出的时候发现得返回数组,那干脆逆序了,出个p。
3. 代码实现
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reversePrint(self, head: ListNode) -> List[int]:
stack = []
while head:
stack.append(head.val)
head = head.next
return list(reversed(stack))
三、 1381. 设计一个支持增量操作的栈
1. 题目描述
2. 思路分析
- 这题是区间更新,第一时间想到线段树lazytag、树状数组差分等优化。
- 然后是个栈,因此我们可以借用差分思想来优化。
- 由于必增量前缀k一段,因此只需要声明第k-1个元素比后一个大了val,那么这个操作就是O(1)的。
- 用一个辅助差分数组diff[]来记录这个差分,pop的时候检查栈顶元素的差分值,如果有就一起pop,并传递给top-1即可。
3. 代码实现
class CustomStack:
def __init__(self, maxSize: int):
self.max_size = maxSize
self.diff = [0]*1005
self.stack = []
def push(self, x: int) -> None:
if len(self.stack) >= self.max_size:
return
self.stack.append(x)
def pop(self) -> int:
stack = self.stack
if not stack:
return -1
top = len(stack)-1
if self.diff[top]:
stack[-1] += self.diff[top]
if top-1>=0:
self.diff[top-1] += self.diff[top]
self.diff[top] = 0
return stack.pop()
def increment(self, k: int, val: int) -> None:
self.diff[min(k-1,len(self.stack)-1)] += val
# Your CustomStack object will be instantiated and called as such:
# obj = CustomStack(maxSize)
# obj.push(x)
# param_2 = obj.pop()
# obj.increment(k,val)
四、 1441. 用栈操作构建数组
链接: 1441. 用栈操作构建数组
1. 题目描述
2. 思路分析
从list视角看:
- 每个数字如果不存在,一定是先push再pop。
- 如果存在一定是只push没pop。
从target视角看: - 如果target[i]和target[i+1]之间空了k个位置,那这之间一定是先push且pop了k次。
- 如果target[i]和target[i+1]是连续的,即target[i]+1=target[i+1],那么他们都是指有push。
- 因此只需要检查和前一个的差值,增加push,pop的个数即可。
3. 代码实现
class Solution:
def buildArray(self, target: List[int], n: int) -> List[str]:
ans = []
pre = 0
for x in target:
ans += ['Push','Pop']*(x - pre-1)
ans.append('Push')
pre = x
return ans