大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
0x00
单调栈主要回答这样的几种问题
- 比当前元素更大的下一个元素
- 比当前元素更大的前一个元素
- 比当前元素更小的下一个元素
- 比当前元素更小的前一个元素
0x01 问题一
维护一个单调递减的栈。
Leetcode 496:下一个更大元素 I(超详细的解法!!!)
Leetcode 503:下一个更大元素 II(超详细的解法!!!)
class Solution:
def nextGreaterElement(self, nums):
""" :type nums1: List[int] :type nums2: List[int] :rtype: List[int] """
stack = list()
res = [-1]*len(nums)
for i, n in enumerate(nums):
while stack and nums[stack[-1]] < n:
res[stack.pop()] = n
stack.append(i)
return res
0x02 问题二
维护一个单调递减的栈。
Leetcode 901:股票价格跨度(超详细的解法!!!)
Leetcode 239:滑动窗口最大值(超详细的解法!!!)(更明确为区间最大元素问题)
class Solution:
def preGreaterElement(self, nums):
""" :type nums1: List[int] :type nums2: List[int] :rtype: List[int] """
stack = list()
res = [-1]*len(nums)
for i, n in enumerate(nums):
while stack and nums[stack[-1]] < n:
stack.pop()
if stack:
res[i] = nums[stack[-1]]
stack.append(i)
return res
0x03 问题三
维护一个单调递增的栈。
Leetcode 84:柱状图中最大的矩形(超详细的解法!!!)
class Solution:
def nextSmallerElement(self, nums):
""" :type nums1: List[int] :type nums2: List[int] :rtype: List[int] """
stack = list()
res = [-1]*len(nums)
for i, n in enumerate(nums):
while stack and nums[stack[-1]] > n:
res[stack.pop()] = n
stack.append(i)
return res
0x04 问题四
维护一个单调递增的栈。
class Solution:
def preSmallerElement(self, nums):
""" :type nums1: List[int] :type nums2: List[int] :rtype: List[int] """
stack = list()
res = [-1]*len(nums)
for i, n in enumerate(nums):
while stack and nums[stack[-1]] > n:
stack.pop()
if stack:
res[i] = nums[stack[-1]]
stack.append(i)
return res
至于最后一点要说的就是,如何确定是使用严格单调栈
还是非严格单调栈
?只要根据题意确定我们栈中是否可以存放相同元素即可。
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/190554.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...