接雨水,由题目可知,当前位置的雨水 = max(0, min(leftmax, rightmax) - currheight)

解法1 time O(N), space O(N)

使用两个数组, leftmax, rightmax ,其中 leftmax[i] = max(height[0:i]) 同理 rightmax[i] = max(height[i+1:]) 然后再遍历并加上结果

解法2 time O(N), space O(N)

不难得知我们还可以使用递减单调栈,即每次遇到雨水时先根据最近高的先加一点,最终累计的雨水与直接计算两边的高度所得的雨水是相同的 设 st, 遇到下一个最大的时候, 添加(next - st.top()) * (st.top().idx - nextIdx + 1)

解法3 time O(N), space O(1)

基于解法1,我们不难发现从左到右和从右到左都是必要的遍历。

假设从左到右的 index 标记为 l, 从右到左的为 r。基于 min(leftmax, rightmax) ,我们可以先根据大小确定一个端点,然后比它小的全部可以借水了。即: h[l] < h[r]的情况下: r 确定不变,先更新一下 leftmax, 并在答案中加入雨水值 leftmax - curr. 反之亦然。 如果按照这样的顺序持续进行,我们得到当 leftmax > rihgtmax 时或其相反的情况,端点的固定也随之改变,所以我们可以保持在更新两边的值时一定时确定的。 是不会出现情况: 对于某点i, jh[i] < h[j] 但是在这个点的时候 leftmax > rightmax