Leetcode Trapping Rain Water

来源:互联网 发布:知画生孩子视频完整 编辑:程序博客网 时间:2024/05/16 01:57

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!


Difficulty: Hard


Solution: find the peak between the left and the right, which height[i] is larger than min(height[left], height[right]).

public class Solution {    public int helper(int[] height, int left, int right){        int ans = 0;        if(right - left <= 1) return 0;        int min = Math.min(height[left], height[right]);        for(int i = left + 1; i < right; i++){            if(min - height[i] > 0)                ans += min - height[i];        }        return ans;    }    public int trap(int[] height) {        int ans = 0;        int len = height.length;        if(len <= 2)            return 0;        int left = 0, right = len - 1;        while(left < len){            if(left < len - 1 && height[left + 1] < height[left]) break;            left++;        }        while(right >= 0){            if(right > 0 && height[right - 1] < height[right]) break;            right--;        }        if(right - left <= 1) return 0;        while(right - left > 1 ){            if(height[left] > height[right]){                int i = right - 1;                while(i > left){                    if(height[i] >= height[right]){                        ans += helper(height, i, right);                        right = i;                        break;                    }                    i--;                }                if(i == left){                    ans += helper(height, left, right);                }                right = i;            }            else{                int i = left + 1;                while(i < right){                    if(height[i] >= height[left]){                        ans += helper(height, left, i);                        left = i;                        break;                    }                    i++;                }                if(right == i){                    ans += helper(height, left, right);                }                left = i;                            }        }        return ans;                            }}




0 0
原创粉丝点击