返回
进阶之作 单调栈解题思路大揭秘 解决那些`hard`难度难题
后端
2023-11-01 13:58:24
单调栈是一种先进后出的栈结构,与普通栈的不同之处在于,它要求栈内元素满足某种单调性,即元素之间存在某种大小或顺序关系。单调栈在很多算法和数据结构中都有着广泛的应用,比如股票问题、接雨水问题、最大矩形问题等。在这些问题中,单调栈可以帮助我们维护一个有序序列,并快速地找到满足特定条件的元素。
接雨水问题
接雨水问题是经典的单调栈应用场景之一。在这个问题中,给定一个由正整数组成的数组,代表一系列柱子的高度。每个柱子可以接住一定量的水,接住的水量取决于柱子的高度和左右两侧柱子的高度。求出所有柱子可以接住的总水量。
我们可以使用单调栈来解决接雨水问题。首先,我们将柱子的高度从左到右依次入栈。当我们遇到一个柱子高度大于栈顶元素的高度时,我们将其出栈。当我们遇到一个柱子高度小于等于栈顶元素的高度时,我们将其入栈。出栈的柱子代表它可以接住的水量,入栈的柱子代表它还需要等待更高柱子的到来。
以下是一个用单调栈解决接雨水问题的示例代码:
def trap(height):
stack = []
total_water = 0
for i, h in enumerate(height):
while stack and h > height[stack[-1]]:
top = stack.pop()
if stack:
total_water += (min(h, height[stack[-1]]) - height[top]) * (i - stack[-1] - 1)
stack.append(i)
return total_water
最大矩形问题
最大矩形问题是另一个经典的单调栈应用场景。在这个问题中,给定一个由0和1组成的二维数组,求出这个二维数组中最大的矩形面积。
我们可以使用单调栈来解决最大矩形问题。首先,我们将每一行的元素从左到右依次入栈。当我们遇到一个0时,我们将其出栈。当我们遇到一个1时,我们将其入栈。出栈的元素代表它可以形成一个矩形,入栈的元素代表它还需要等待更多的1的到来。
以下是一个用单调栈解决最大矩形问题的示例代码:
def maximal_rectangle(matrix):
if not matrix:
return 0
m, n = len(matrix), len(matrix[0])
heights = [0] * (n + 1)
max_area = 0
for i in range(m):
for j in range(n):
heights[j] = heights[j] + 1 if matrix[i][j] == '1' else 0
stack = []
for j, h in enumerate(heights):
while stack and h < heights[stack[-1]]:
top = stack.pop()
max_area = max(max_area, heights[top] * (j - stack[-1] - 1 if stack else j))
stack.append(j)
return max_area
结束语
单调栈是一种非常强大的数据结构,它可以帮助我们解决很多难题。在本文中,我们介绍了单调栈的基本原理,并用单调栈解决了接雨水问题和最大矩形问题。如果你想了解更多关于单调栈的知识,可以参考以下资料: