利用单调了栈求解leetcode 84柱状图中最大的矩形
利用单调递增栈的方式来实现,计算发生在每次弹出栈顶的操作过程中
单调递增栈的操作步骤
1。如果栈为空或者栈顶元素比入栈小 该元素直接入栈
2。其他 弹出栈顶直至栈顶元素比当前入栈元素小为止,该元素入栈
伪代码:
if stack == NULL or top(stack)< item:
push(item);
else :
while(top(stack)>item):
top = pop(stack)
push(item);
1. (2,1)入栈,此时栈里内容为 (2,1)第一个数字代表内容第二个数字代表该数字在Numbers[i]当中的序号 这里采用1-起始,$为栈底 最右侧为栈顶
2. 扫描到第二个数字1,(1,2)入栈。因为1小于栈顶元素2,所以弹出栈顶 让(1,2)入栈,此时开始运算弹出元素的面积这里是序号为1,值为2的元素计算面积S1
S1= n[1]*(入栈序号-该元素前一个序号-1) = n[1]*(2-0-1)=2*1 =2
此时栈内容为 $,(1,2)
3.扫描到第三个数字5,(5,3)入栈 ,因为 5大于栈顶。
此时栈内容为: $,(1,2),(5,3)
4.扫描第4个数字6 ,(6,4)入栈 ,因为 6大于栈顶5。
此时栈内容为: $,(1,2),(5,3),(6,4)
5.扫描第5个数字2 ,(2,5)入栈 ,因为 2小于栈顶5。
弹栈(6,4)计算S4
S4= n[1](入栈序号-该元素前一个序号-1) = n[4](5-3-1)=6*1 =6
弹栈(5,3)计算S3
S3= n[1](入栈序号-该元素前一个序号-1) = n[3](5-2-1)=5*2 =10
此时栈内容为: $,(1,2), (2,5)
6扫描第6个数字3 入栈 此时栈内容为: $,(1,2),(2,5),(3,6)
弹栈(3,6) 计算S6
S6= n[6](入栈序号-该元素前一个序号-1) = n[6](7-5-1)=3*1 =3
弹栈(2,5) 计算S5
S5= n[5](入栈序号-该元素前一个序号-1) = n[5](7-2-1)=2*4 =8
此时 没有入栈入栈序号为7
此时栈内容为: $,(1,2)
弹栈 (1,2) 计算S2
S2= n[2](入栈序号-该元素前一个序号-1) = n[2](7-0-1)=1*6 =6
最大值
max = 10
总程序的伪代码:
‘for item in numbers:
if stack == NULL or top(stack)< item:
push(item);
else :
while(top(stack)>item):
top = pop(stack)’
计算S[top] 的面积
push(item);
end for
while(len(stack)>0):
top = pop(stack)
计算S[top] 的面积
max_area =max{S[i] ; i=0 to N }