算法描述:
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
Example:
Input:[ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"]]Output: 6
解题思路:利用直方图最大面积求解,每一行构建一个直方图。当元素为1时,直方图对应元素加1,否则置为0;
int maximalRectangle(vector>& matrix) { if(matrix.size()==0 || matrix[0].size()==0) return 0; int m = matrix.size(); int n= matrix[0].size(); int maxArea = 0; vector hist(n,0); for(int i=0; i < m; i++){ for(int j =0; j < n; j++){ if( matrix[i][j] == '1') hist[j] += 1; else hist[j] = 0; } maxArea = max(maxArea,maxAreaOfHist(hist)); } return maxArea; } int maxAreaOfHist(vector & heights){ if(heights.size()==0) return 0; stack stk; int maxArea = 0; int i=0; while(i < heights.size()){ if(stk.empty() || heights[i] >= heights[stk.top()]){ stk.push(i); i++; }else{ int index = stk.top(); stk.pop(); maxArea = max(maxArea, heights[index]*(stk.empty()? i: i-stk.top()-1)); } } while(!stk.empty()){ int index = stk.top(); stk.pop(); maxArea = max(maxArea, heights[index]*(stk.empty()?i:i-stk.top()-1)); } return maxArea; }