Trapping Rain Water

来源:互联网 发布:mac文档怎么保存 编辑:程序博客网 时间:2024/06/03 21:36

leetcode第42题,这个题解法非常多,典型的就是栈法和双指针法,除此之外还有不少奇奇怪怪的方法,在此只记录三种。

第一种,栈方法,基本思路是,遍历整个高度数组,遇到比之前一项小的元素就压入栈,遇到比前一个元素大的元素则开始检查栈,如果该元素比栈顶元素小,说明可以存水,则弹出栈顶,同时计算存水的量。此时栈中原来的第二个元素成为栈顶元素,继续与该元素比较,直至栈空或者栈顶元素大于该元素,这说明无法存水,就停止检查栈,转而继续遍历数组。

计算存水量的方法是,比较弹出的栈顶元素与前后两个元素之间的差值,这两个差值的最小值就是存水量。

这里有三个检查栈空的操作,第一个是最外层的for循环,主要是为了压入首个元素。第二个第三个主要是做边界的检查。

这里使用了python的列表模拟了栈。

class Solution(object):    def trap(self, height):        """        :type height: List[int]        :rtype: int        """        n = len(height)        ans = 0        stack = []        for i in range(0,n):            if len(stack) == 0 or height[i] < height[stack[-1]] :                stack.append(i)            else:                while(len(stack) != 0 and height[stack[-1]] < height[i]):                    pre =  stack[-1]                    del stack[-1]                    if len(stack) != 0:                        ans += min(height[i]-height[pre],height[stack[-1]]-height[pre])*(i-stack[-1]-1)                stack.append(i)        return ans

第二种方法是双指针,主要思路是从两边向中间遍历,其实这个问题就是一个找出挡板的问题,先从两边向中间找出边界的峰值,作为最边缘的挡板,然后不断地比较左右元素与峰值最小值的差,这就是该元素的存水量,加上去就可以了,一旦出现了有元素大于了峰值,则更新峰值,其实就是更换了挡板。

class Solution {public:    int trap(vector<int>& height) {        int n = height.size();        int left = 0;        int right = n-1;        int sum = 0;        while(left < right && height[left+1] > height[left])             left++;        while(left < right && height[right-1] > height[right])             right--;        while(left < right)        {            int rightmost = height[right];            int leftmost = height[left];            if (leftmost < rightmost)            {                while(left < right && height[++left] < leftmost) sum += leftmost-height[left];            }            else            {                while(left < right && height[--right] < rightmost) sum += rightmost-height[right];            }        }        return sum;    }};

还有一种方法比较好理解,每个位置上的存水量都是由它左右两边的峰值的最小值决定的,因此可以先遍历数组,求出每个位置上的左右峰值先行储存起来,然后就可以额计算每个位置上的存水量了。

0 0
原创粉丝点击