LeetCode | 42. Trapping Rain Water

来源:互联网 发布:淘宝客佣金设置怎么算 编辑:程序博客网 时间:2024/06/06 01:45

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

这里写图片描述

思路:模拟算法,对于每个it,向右查找,分两种情况:
1、右边找到一个不比他矮的,那就把它作为右边界,因为再向右产生的水坑就和it没关系了
2、找不到不必it矮的,就找一个其中最高的且第一次出现的,作为右边界。
然后计算右边界和it之间产生的水坑的面积

//13 msclass Solution {public:    int trap(vector<int>& height)    {        int len = height.size();        int res = 0;        int it = 0, max_index = 0, mmax = 0;        while(it < len)        {            max_index = it;            mmax = 0;            for(int i=it+1;i<len;i++)            {                if(height[i] >= height[it])//比他高了,后面的水坑不由it决定了                {                    max_index = i; break;                }                if(height[i] > mmax)//找到后面第一个最高的那个,比如50202,就是第三个                {                    mmax = height[i];                    max_index = i;                }            }            int delta = min(height[it],height[max_index]);            for(int j=it;j<max_index;j++)            {                if(height[j] < delta)                    res += (delta-height[j]);            }            if(max_index == it)                it++;            else                it = max_index;        }        return res;    }};

另一个思路,solution中提供的O(n)算法,实际运行时效果反而不是很理想,16 ms

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