/**
* @Classname CatchRain
* @Description TODO
* @Version 1.0.0
* @Date 2021/11/2 9:20
* @Created by DiTian
*/publicclassCatchRain{publicstaticvoidmain(String[] args){int[] height =newint[]{0,1,0,2,1,0,1,3,2,1,2,1};//动态规划实现//int total = trap1(height);//单调栈实现//int total = trap2(height);//双指针实现int total =trap3(height);System.out.println("最大雨水量:"+total);}privatestaticinttrap3(int[] height){int ans =0;int left =0,right = height.length-1;int leftMax =0,rightMax =0;while(left < right){
leftMax =Math.max(leftMax,height[left]);
rightMax =Math.max(rightMax,height[right]);if(height[left]< height[right]){
ans += leftMax-height[left];
left++;}else{
ans += rightMax-height[right];
right--;}}return ans;}privatestaticinttrap2(int[] height){int ans =0;Deque<Integer> stack =newLinkedList<Integer>();int n = height.length;for(int i =0; i < n; i++){while(!stack.isEmpty()&& height[i]> height[stack.peek()]){int top = stack.pop();//取出栈顶元素if(stack.isEmpty())break;int left = stack.peek();int currWidth = i-left-1;int currHeight =Math.min(height[left],height[i])-height[top];
ans += currWidth*currHeight;}
stack.push(i);}return ans;}privatestaticinttrap1(int[] height){int n = height.length;//1,记录左边最大高度int[] leftMaxArr =newint[n];
leftMaxArr[0]= height[0];for(int i =1; i < n; i++){
leftMaxArr[i]=Math.max(leftMaxArr[i-1],height[i]);}//2,记录右边最大高度int[] rightMaxArr =newint[n];
rightMaxArr[n-1]= height[n-1];for(int i = n-2; i >=0; i--){
rightMaxArr[i]=Math.max(rightMaxArr[i+1],height[i]);}//3,求雨水总量int ans =0;for(int i =0; i < n; i++){
ans +=Math.min(leftMaxArr[i],rightMaxArr[i])-height[i];}return ans;}}