1. 题目
1.1 题目解析
具有最小相关性我们使用栈。
我们
- T20. 有效的括号
class Solution:
def isValid(self, s: str) -> bool:
stack=[]
for i in s:
if i in ('(','[','{'):
stack.append(i)
else:
if len(stack) == 0:
return False
if stack[-1] == '(' and i != ')':
return False
if stack[-1] == '[' and i != ']':
return False
if stack[-1] == '{' and i != '}':
return False
stack.pop()
return len(stack) == 0
时间复杂度O(n)
2. T155. 最小栈
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.min_stack = [math.inf]
def push(self, x: int) -> None:
self.stack.append(x)
self.min_stack.append(min(x,self.min_stack[-1]))
def pop(self) -> None:
self.stack.pop()
self.min_stack.pop()
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.min_stack[-1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
时间复杂度O(n)
3.T84.柱状图中最大的矩形
思路:要维护一个栈,为的是找到左边界
- 暴力求解
时间复杂度O(1)
- T239. 滑动窗口最大值
所有滑动的题均用队列解决
- 暴力求解
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
n = len(nums)
if n*k == 0:
return []
return [max(nums[i:i+k]) for i in range(n-k+1)]
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
res = []
if nums != 0:
for i in range(0,len(nums)-(k-1)):
max_nums = max(nums[i:i+k])
res.append(max_nums)
return res
时间复杂度O(kn)
- 双端队列
from collections import deque
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
n = len(nums)
if n*k == 0:
return []
if k == 1:
return nums
def deq_clean(i):
if deq and deq[0] == i-k:
deq.popleft()
while deq and nums[i] > nums[deq[-1]]:
deq.pop()
deq = deque()
max_idx = 0
for i in range(k):
deq_clean(i)
deq.append(i)
if nums[i] > nums[max_idx]:
max_idx = i
output = [nums[max_idx]]
for i in range(k,n):
deq_clean(i)
deq.append(i)
output.append(nums[deq[0]])
return output