20. Valid Parentheses

  1. class Solution:
  2. def isValid(self, s: str) -> bool:
  3. dic = {
  4. ')': '(',
  5. ']': '[',
  6. '}': '{'
  7. }
  8. stack = []
  9. for ch in s:
  10. if ch in dic: # 右括号
  11. if stack and stack[-1] == dic[ch]:
  12. stack.pop()
  13. else:
  14. return False
  15. else: # 左括号
  16. stack.append(ch)
  17. return not stack
  • 时间复杂度:栈 - 图1
  • 空间复杂度:栈 - 图2

402. Remove K Digits

实际上是字典序的应用:对于两个不同的数字串,最靠左的不同的digit决定了两者大小;若要使得最后得到的数字串最小,则必须保证靠左的digit尽可能的小。

  1. class Solution:
  2. def removeKdigits(self, num: str, k: int) -> str:
  3. remain = len(num) - k
  4. stack = [] # 非严格单调递增栈
  5. for digit in num:
  6. while k and stack and digit < stack[-1]:
  7. stack.pop()
  8. k -= 1
  9. stack.append(digit)
  10. return ''.join(stack[:remain]).lstrip('0') or '0'
  • 时间复杂度:栈 - 图3
  • 空间复杂度:栈 - 图4

739. Daily Temperatures

  1. class Solution:
  2. def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
  3. res = [0] * len(temperatures)
  4. stack = [] # 存放index的非严格单挑递减栈
  5. for i, T in enumerate(temperatures):
  6. while stack and T > temperatures[stack[-1]]:
  7. j = stack.pop()
  8. res[j] = i - j
  9. stack.append(i)
  10. return res
  • 时间复杂度:栈 - 图5
  • 空间复杂度:栈 - 图6

232. Implement Queue using Stacks

  1. class MyQueue:
  2. def __init__(self):
  3. self.A = []
  4. self.B = []
  5. def push(self, x: int) -> None:
  6. self.A.append(x)
  7. def pop(self) -> int:
  8. if not self.B:
  9. while self.A:
  10. self.B.append(self.A.pop())
  11. return self.B.pop()
  12. def peek(self) -> int:
  13. if self.B:
  14. return self.B[-1]
  15. else:
  16. return self.A[0]
  17. def empty(self) -> bool:
  18. return not self.A and not self.B
  • 时间复杂度:pop()peek() 操作都是均摊 栈 - 图7
  • 空间复杂度:栈 - 图8