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; } }