Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.spa
這題目是:是Largest Rectangle in Hisgoram的升級版本。code
只要那個問題解決了,而後for int i = 0 to i < n 而後根據子矩陣抽象成直方圖的方式 最後能夠解決blog
O(n*n) 或者 O(n*n*logn)it
class Solution { public: int maximalRectangle(vector<vector<char> > &matrix) { // Start typing your C/C++ solution below // DO NOT write int main() function if(!matrix.size()) return 0; int start, largest = 0; vector<int> left(matrix[0].size(), 0); vector<int> right(matrix[0].size(), 0); vector<int> height(matrix[0].size(), 0); for(int i = 0; i < matrix.size(); i++) { left[0] = 0; right[matrix[0].size() - 1] = matrix[0].size() - 1; for(int j = 0; j < matrix[0].size(); j++) if(matrix[i][j] == '1') height[j] += 1; else height[j] = 0; for(int j = 1; j < matrix[0].size(); j++) { start = j; while(start > 0 && height[j] <= height[start-1]) start = left[start-1]; left[j] = start; } for(int j = matrix[0].size() - 2; j >= 0; j--) { start = j; while(start < height.size()-1 && height[j] <= height[start+1 ]) start = right[start+1]; right[j] = start; } for(int j = 0; j < matrix[0].size(); j++) { int temp = (right[j] - left[j] + 1) * height[j]; if(temp > largest) largest = temp; } } return largest; } };