单调栈是一个栈,里面的元素的大小按照它们所在栈的位置,满足一定的单调性;
性质:
应用场景
优点:实践复杂度是线性的,每个元素只遍历一次
单调递减栈,每次都能找到左边第一个比它大的数
单调递增栈,每次都能找到左边第一个比它小的数
https://leetcode.cn/problems/largest-rectangle-in-histogram/description/
依次遍历柱形的高度,对于每一个高度分别向两边扩散,求出当前高度为矩形的最大宽度
该解法在用例数量过多时,容易超出实时间限制
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
size = len(heights)
res = 0
for i in range(size):
# 找左边最后一个大于等于heights[i]的下标
left = i
cur_height = heights[i]
while left > 0 and heights[left-1] >= cur_height:
left -= 1
# 找右边最后一个大于等于heights[i]的下标
right = i
while right < size-1 and heights[right + 1] >= cur_height:
right += 1
max_width = right - left + 1
res = max(res, max_width * cur_height)
return res
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
stack = []
left = [0 for _ in range(len(heights))]
right = [0 for _ in range(len(heights))]
res = 0
# 获取每根柱子左边第一个比它低的柱子下标
for i in range(len(heights)):
while stack and heights[stack[-1]] >= heights[i]:
stack.pop()
if not stack:
left[i] = -1
else:
left[i] = stack[-1]
stack.append(i)
stack = []
# 获取每根柱子右边第一个比它低的柱子下标
for j in range(len(heights) - 1, -1, -1):
while stack and heights[stack[-1]] >= heights[j]:
stack.pop()
if not stack:
right[j] = len(heights)
else:
right[j] = stack[-1]
stack.append(j)
# 求最大面积
for i in range(len(heights)):
res = max(res, heights[i] * (right[i] - left[i] - 1))
return res
数据结构与算法(python)http://t.csdnimg.cn/Gb6MN
程序 = 数据结构 + 算法;而且在面试过程中这些是必考,必问的内容。内容大纲:基础数据结构(树、链表、栈、队列等)、常见算法(排序算法、递归算法等)。
专栏是基于python的基础知识,是很好的入门学习资料。帮助大家快速理解这些数据结构和常见算法的概念,同时结合力扣题目,也能更好的掌握这些知识,达到在面试中游刃有余的效果。
python基础精讲 http://t.csdnimg.cn/HdKdi
本专栏主要针对python基础语法,帮助学习者快速接触并掌握python大部分最重要的语法特征。
1、基本数据类型和变量
2、分支结构与循环结构
3、函数与异常处理
4、类与模块
5、文件读写
通过本专栏可以快速掌握python的基础语法。