題目:
思考1:
- 利用柱形圖最大矩形的思想
- 對于矩陣的每一行看作是柱形圖的地基
- 對每一行(認定為柱形圖)執行找最大矩形
實現:
class Solution {
public:int maximalRectangle(vector<vector<char>>& matrix) {int m=matrix.size();int n=matrix[0].size();vector<vector<int>>m_v(m,vector<int>(n,0));for (int i=0;i<m;i++){for (int j=0;j<n;j++){if (matrix[i][j]=='1'){if (i>0)m_v[i][j]=m_v[i-1][j]+1;elsem_v[i][j]=1;}}}int ret=0;for(int i=0;i<m;i++){stack<int> stk;for (int j=0;j<n;j++){while (!stk.empty()&&m_v[i][j]<m_v[i][stk.top()]){int top=stk.top();stk.pop();while(!stk.empty()&&m_v[i][stk.top()]==m_v[i][top]){stk.pop();}if (stk.empty()){ret=max(ret,j*m_v[i][top]);}else{ret=max(ret,(j-stk.top()-1)*m_v[i][top]);}}stk.push(j);}while(!stk.empty()){int top=stk.top();stk.pop();while(!stk.empty()&&m_v[i][stk.top()]==m_v[i][top]){stk.pop();}if (stk.empty()){ret=max(ret,n*m_v[i][top]);}else{ret=max(ret,(n-stk.top()-1)*m_v[i][top]);}}}return ret;}
};