publicinttrap(int[] height){Stack<Integer> stack =newStack<>();if(height ==null|| height.length <3){return0;}int ans =0;for(int i =0; i < height.length; i++){while(stack.size()>0&& height[stack.peek()]<= height[i]){int popNum = stack.pop();if(stack.size()>0){int h =Math.min(height[i]- height[popNum], height[stack.peek()]- height[popNum]);int l = i - stack.peek()-1;
ans += h * l;}}
stack.push(i);}return ans;}
publicintlargestRectangleArea(int[] heights){int ans =0;intN= heights.length;Stack<Integer> stack =newStack<>();for(int i =0; i < heights.length; i++){while(stack.size()>0&& heights[stack.peek()]>= heights[i]){int popNum = stack.pop();int k = stack.size()==0?-1: stack.peek();int l = i - k -1;
ans =Math.max(ans, heights[popNum]* l);}
stack.push(i);}while(stack.size()>0){int popNum = stack.pop();int k = stack.size()==0?-1: stack.peek();int l =N- k -1;
ans =Math.max(ans, heights[popNum]* l);}return ans;}
publicintmaximalRectangle(String[] matrix){int ans =0;if(matrix ==null|| matrix.length ==0|| matrix[0].length()==0){return0;}int[] height =newint[matrix[0].length()];for(int i =0; i < matrix.length; i++){String s = matrix[i];for(int j =0; j < s.length(); j++){
height[j]= s.charAt(j)=='0'?0: height[j]+1;}
ans =Math.max(ans,process(height));}return ans;}privateintprocess(int[] height){Stack<Integer> stack =newStack<>();intN= height.length;int ans =0;for(int i =0; i < height.length; i++){while(stack.size()>0&& height[stack.peek()]>= height[i]){int popNum = stack.pop();int k = stack.size()==0?-1: stack.peek();int l = i - k -1;
ans =Math.max(ans, l * height[popNum]);}
stack.push(i);}while(stack.size()>0){int popNum = stack.pop();int k = stack.size()==0?-1: stack.peek();int l =N- k -1;
ans =Math.max(ans, height[popNum]* l);}return ans;}