保持栈的单调,只有栈为空或比栈顶大/小的元素才可入栈,否则出栈直到满足条件
In order to keep the stack monotonic, only when the stack is empty or the top element of the stack is smaller/bigger than the input one, the element will be pushed into the stack. Otherwise, pop the elements from the stack until the criteria meets.
For an example:
在这个问题中,应用了单调栈的思想,只有比栈顶大的元素才可入栈
出栈时,对出栈元素的左右边界进行计算,栈顶的左边界为0,其他元素左右边界均为栈中相邻元素的数组下标,出栈元素的值*边界长度为待求子矩形的面积
class Solution: def largestRectangleArea(self, heights: [int]) -> int: if len(heights) == 0:return 0 max_stack = [] maxs = heights[0] for i in range(len(heights)): if len(max_stack) == 0 or max_stack[-1][0] <= heights[i]: max_stack.append([heights[i], i]) else: top = max_stack[-1][1] while len(max_stack) > 0 and max_stack[-1][0] > heights[i]: last = max_stack.pop() if len(max_stack) > 0: maxs = max(maxs, last[0] * (top - max_stack[-1][1])) else: maxs = max(maxs, last[0] * (top + 1)) max_stack.append([heights[i], i]) top = max_stack[-1][1] while len(max_stack) > 0: last = max_stack.pop() if len(max_stack) > 0: maxs = max(maxs, last[0] * (top - max_stack[-1][1])) else: maxs = max(maxs, last[0] * (top + 1)) return maxs