Maximal Rectangle

ref

// http://www.cnblogs.com/springfor/p/3869492.html
// http://blog.csdn.net/linhuanmars/article/details/24444491

//https://leetcode.com/problems/largest-rectangle-in-histogram/

参考Largest Rectangle in Histogram(算法复杂度是O(n)

算法总时间复杂度是O(m*n)

public class Solution {

    public int maximalRectangle(char[][] matrix) {

        if(matrix==null|| matrix.length==0|| matrix[0].length==0) return 0;

        int m = matrix.length, n = matrix[0].length;

        int[] hl = new int[n];

        int res = 0;

        for(int i=0;i<m;i++){

            for(int j=0; j<n; j++){

                if(matrix[i][j]=='0'){

                    hl[j]=0;

                }else

                    hl[j]++;

            }

            res = Math.max(res, LargestRectangle(hl));

        }

        return res;

    }

    public int LargestRectangle(int[] his){

        int len =his.length+1;

        int[] h = new int[len];

        h = Arrays.copyOf(his, len);

        int res=0, i=0;

        Stack<Integer> st = new Stack<Integer>();

        while(i<len){

            if(st.isEmpty()||h[st.peek()]<=h[i]){

                st.push(i++);  // must increase i here! always forgot

            }else{

                int t = st.pop();

                res = Math.max(res, h[t]*(st.isEmpty()?i:i-st.peek()-1));

            }

        }

        return res;

    }

}

 

你可能感兴趣的:(max)