Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
首先,想使用遍歷兩次的暴力方法解決是不靠譜的,先打消這個念頭。
這道題的解法靈感來自於 Largest Rectangle in Histogram 這道題,假設我們把矩陣沿著某一行切下來,然後把切的行作為底面,將自底面往上的矩陣看成一個直方圖。這樣就能轉化為使用我們解決的問題來解決新的問題。直方圖的中每個項的高度就是從底面行開始往上1的數量。
我們只需要構造一個一唯的矩陣存儲,以當前行為底的柱狀圖就可以。在第一次的時候只考慮第一行,在第二次的時候查看第二行的元素,如果是0,那麼當前一唯矩陣置為0,否則加1。
class Solution {public:int largestRectangleArea(vector&h) { stackS; h.push_back(0);int sum = 0;for (int i = 0; i < h.size(); i++) {if (S.empty() || h[i] > h[S.top()]) S.push(i);else {int tmp = S.top();S.pop();sum = max(sum, h[tmp]*(S.empty()? i : i-S.top()-1));i--;}}return sum;}int maximalRectangle(vector> &matrix) { if(matrix.size() == 0 || matrix[0].size() == 0)return 0;int maxArea = 0;vectortemp(matrix[0].size(), 0);//用來調用輔助函數的參數向量 for(int i = 0; i < matrix.size(); i++){for(int j = 0; j < matrix[0].size(); j++){ //在每一行都重置輔助向量if(matrix[i][j] == '1')temp[j]++;elsetemp[j] = 0; //斷開了,就置零}int ret = largestRectangleArea(temp);maxArea = ret > maxArea ? ret : maxArea;}return maxArea;}};