Trapping Water
Thoughts
能积水的地方必然是一个中间低两边高的凹陷,其实这一题有点像largest rectangle in histogram, 当遇到右边比前一个高的bar时,就相当于找到了右边界,然后我们要继续找到 左边界,并在这个过程中计算水的容量。
所以我们在stack里存的是一个递减序列,当我们遇到index i,而height[i] > height[i-1], 说明我们遇到了一个右边界,要开始灌水了,就将stack的top与height[i]比较,不断地pop直到 stack top > height[i], 说明这个右边界不能继续用了。
另一个要注意的是,在计算能装多少水的时候,bottom其实是不断变化的,所以我们要在stack
pop的过程中也随时改变Bottom才对。而每次找到一个右边界j的时候,新加入的水量就是
(i - j - 1) * (height[s.top()] - bottom)
当stack pop完了之后,当前bar也应该要push到stack里面,这个跟largest rectangle一样