LeetCode:Trapping Rain Water

来源:互联网 发布:淘宝达人怎么修改资料 编辑:程序博客网 时间:2024/05/18 02:54

Trapping Rain Water




Total Accepted: 68935 Total Submissions: 211305 Difficulty: Hard

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.


The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. 

Thanks Marcos for contributing this image!

Subscribe to see which companies asked this question

Hide Tags
 Array Stack Two Pointers
Hide Similar Problems
 (M) Container With Most Water (M) Product of Array Except Self






























思路一:

观察水的分布可发现,水位的分布情况显现梯形的,即先上升后下降。

因此可以先求出最高点,然后左右两边往中间遍历求水的容量。


c++ code:

class Solution {public:    int trap(vector<int>& height) {                int size = height.size();                int maxIndex = 0;        for(int i=0;i<size;i++) {            if(height[i] > height[maxIndex]) maxIndex = i;         }                int area = 0;        int maxLeft = 0;        for(int i=0;i<maxIndex;i++) {            if(height[i] > maxLeft) maxLeft = height[i];            else area += maxLeft - height[i];        }                int maxRight = 0;        for(int i=size-1;i>=maxIndex;i--) {            if(height[i] > maxRight) maxRight = height[i];            else area += maxRight - height[i];        }                return area;    }};


思路二:

直接用两个指针分别往中间移动,每次维持次高的水位secHeight。


java code:

public class Solution {    public int trap(int[] height) {                int len = height.length;                int left = 0, right = len - 1;        int secHeight = 0;        int area = 0;        while(left <right) {            if(height[left] < height[right]) {                secHeight = Math.max(secHeight, height[left]);                area += secHeight - height[left];                left++;            } else {                secHeight = Math.max(secHeight, height[right]);                area += secHeight - height[right];                right--;            }        }        return area;    }}


0 0