参考的链接

import java.util.*;


public class Solution {
    public int maximalRectangle (int[][] matrix) {
        //调用length获得二维数组的行数n
        //求出二维数组的列数m
        int n=matrix.length;
        int m=matrix[0].length;
        //正向遍历每一行,逆向遍历列,求出每个元素的右边连续1的个数
        for(int i=0;i<n;i++){
            for(int j=m-2;j>=0;j--){
                  matrix[i][j]=matrix[i][j]==0?0:matrix[i][j]+matrix[i][j+1];
            }
        }
        int maxArea=0;
        int j=0;
        //遍历每一列,分别将每一列的不同行作为直方图,求出最大的矩形的面积
        while(j<m){
            int maxheight=0;
            int[] height=new int[n];
            //以每一列的每一行的元素作为直方图的底,求出每个直方图的高度,以及最大的直方图的高度
            for(int i=0;i<n;i++){
                height[i]=matrix[i][j];
                maxheight=Math.max(maxheight,height[i]);
            }
            //如果直方图的最大的高度为0,那么就表示不能形成矩形,直接以后一列的不同行的元素 作为底的直方图所能形成的最大的矩形
            if(maxheight==0){
                j++;
                continue;
            }
            //调用函数求出最大的矩形的面积
            maxArea=Math.max(maxArea,largestRectangleArea(height));
            j++;
        } 
        return maxArea;
    }
    //求出最大的矩形的面积
    private int largestRectangleArea(int[] height){
        //开一个栈
        Stack<Integer> stack=new Stack<>();
        int n=height.length;
        int maxArea=0;
       //遍历每一个高度
       //只要栈不为空并且后面入栈的元素小于栈顶的元素
       //就将栈顶记录的高度作为矩形的高,矩形的右边界就是即将入栈的元素i,矩形的左边界就是l
       //所以矩形的面积就是h*(i-l)
        for(int i=0;i<n;i++){
             while(!stack.empty()&&height[stack.peek()]>height[i]){
                int h=height[stack.pop()];
                int l=stack.empty()?0:stack.peek()+1;
                maxArea=Math.max(maxArea,h*(i-l));
             }
             stack.push(i);
        }
        //对于剩下的元素
        //只要栈不为空,就将栈顶的元素记录的高度作为矩形的高h
        //矩形的右边界就是n,左边界是l,矩形的面积=h*(n-l)
        while(!stack.empty()){
            int h=height[stack.pop()];
            int l=stack.empty()?0:stack.peek()+1;
            maxArea=Math.max(maxArea,h*(n-l));
        }
       return maxArea;
    }
}