题目:原题链接(中等)
标签:栈、栈-单调栈
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
---|---|---|---|
Ans 1 (Python) | 最坏情况 : O ( N 2 ) O(N^2) O(N2) | 最快情况 : O ( N ) O(N) O(N) | 8444ms (5.13%) |
Ans 2 (Python) | O ( N ) O(N) O(N) | O ( N ) O(N) O(N) | 184ms (69.43%) |
Ans 3 (Python) | O ( N ) O(N) O(N) | O ( N ) O(N) O(N) | 168ms (94.87%) |
LeetCode的Python执行用时随缘,只要时间复杂度没有明显差异,执行用时一般都在同一个量级,仅作参考意义。
解法一(暴力解法):
def find132pattern(self, nums: List[int]) -> bool:
stack = [] # 需要2列表
now = None
for n in nums:
for s in stack:
if s[0] < n < s[1]:
return True
if now is None:
now = n
elif n < now:
now = n
elif n > now:
for i in range(len(stack) - 1, -1, -1):
s = stack[i]
if now <= s[0] < s[1] <= n:
stack.pop(i)
stack.append([now, n])
return False
解法二(单调栈):
def find132pattern(self, nums: List[int]) -> bool:
# 生成当前之前最小值表
min_lst = []
now = float("inf")
for n in nums:
if n < now:
now = n
min_lst.append(now)
# 从后向前遍历,维护单调栈
stack = []
for i in range(len(nums) - 1, -1, -1):
# 移除栈内小于当前最小值的值
while stack and stack[-1] <= min_lst[i]:
stack.pop()
# 判断是否已有解
if stack and nums[i] > stack[-1]:
return True
# 更新栈
elif not stack or nums[i] < stack[-1]:
stack.append(nums[i])
return False
解法三(更好的单调栈):
def find132pattern(self, nums: List[int]) -> bool:
now = float("-inf") # 当前最大的1-3-2中的2
stack = [] # 单调栈
for n in reversed(nums):
if n < now:
return True
while stack and stack[-1] < n:
now = stack.pop()
stack.append(n)
return False