递增(减)栈
应用场景:
针对某个数,寻找它和它【左/右】两边第一个比他【大/小】的数,以及相距多少距离。
1. 接雨水
针对某个洼地,当前能接的雨水等于左右两侧【最大高度】的最小值-当前洼地的高度。(> O ( N 2 ) O(N^2) O(N2))
对于某个洼地来说,其能盛水的量由【左右边界确定】,对于洼地> j 0 , j 1 , j 0 < j 1 , H [ j 0 ] < H [ j 1 ] j_0,j_1,j_0<j_1,H[j_0]<H[j_1] j0,j1,j0<j1,H[j0]<H[j1]> ,显然1的左边届由0界定,将其加入栈中,待确定其右边界,当有
j 2 > j 1 , H [ j 2 ] > H [ j 1 ] 时 , j_2>j_1,H[j_2]>H[j_1]时, j2>j1,H[j2]>H[j1]时,显然1的右边界由2界定,弹出1,其为最低高度,并得到当前栈顶0故0-1-2之间可以存水【 m i n ( H [ j 2 ] , h [ j 0 ] ) ∗ ( j 2 − j 0 + 1 ) min(H[j_2],h[j_0])*(j_2-j_0+1) min(H[j2],h[j0])∗(j2−j0+1)】
【stack.top()<cur,确定右边界,弹出,故使用递减栈> ↓> 】
2. 柱形图中最大的矩形
针对某个柱子,其能形成的最大矩形由其左右两侧【最近的小于其高度】的柱子决定(> O ( N 2 ) O(N^2) O(N2))
1.针对某个柱子p,在其( 从前向后遍历 ) 之前 有 j 0 , j 1 , j 0 < j