leetcode 84柱状图中最大的矩形,利用单调栈求解l

利用单调了栈求解leetcode 84柱状图中最大的矩形

leetcode 84柱状图中最大的矩形,利用单调栈求解l_第1张图片
image
leetcode 84柱状图中最大的矩形,利用单调栈求解l_第2张图片
image

利用单调递增栈的方式来实现,计算发生在每次弹出栈顶的操作过程中

单调递增栈的操作步骤

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 }

你可能感兴趣的:(leetcode 84柱状图中最大的矩形,利用单调栈求解l)