写一个更简洁的,使用栈s,存储一个递增序列的index。当heights[i] < heights[s.top()]时,此时可以计算以heights[s.top()]为高度的长方形。长度的计算要细心,把top元素pop掉后,如果s为空,则长度为i;如果不为空,则长度为i-s.top()-1。不能用i-上一个top掉元素+1,因为某时刻栈中,两个相邻的元素,不一定在vector中也相邻。
1 | class Solution { |
解题思路:此题和最大存水量类似。使用两个栈、数组,记录当前元素为高度时,左边能扩展多少个元素,右边能扩展多少个元素。则当前元素能组成的最大存水量,即高度*(左边个数+右边个数+1)。遍历时,记录下最小值,在寻找左右可以扩展元素的个数时,如果当前元素<=最小值,则遍历过的元素都可以扩展,从而优化算法。
元素 1 2 3 4 5 1
左边可以扩展 0 0 0 0 0 5
右边可以扩展 5 3 2 1 0 0
代码如下:
1 | class Solution { |
运行结果:16ms,超过92.67%