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.對於在一個一維數座標中找出最大的矩形面積,可以採用窮舉遍歷的方式時間複雜度爲O(n^2),但是也可以藉助棧來實現查找,棧的使用過程描述十分麻煩。 棧中存儲遞增序列的元素索引,對於一個新的元素若能保證棧中是遞增序列,那麼入棧;若是不能保證遞增序列,那麼出棧。 出棧時需要解決的是遞增序列所形成的各種面積的計算:若棧不爲空,那麼出棧元素爲高所形成的面積應與ret比較;若棧爲空了,之前出棧的一定是遞增序列中最小的元素,那麼height[minIndex] * 元素個數得到該元素形成的最大面積。
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
height.push_back(0);
stack<int> st;
int i = 0, ret = 0;
while(i < height.size()) {
if(st.empty() || height[i] >= height[st.top()]) {
st.push(i);
i++;
} else {
int top = st.top();
st.pop();
int width = st.empty() ? i : i - st.top() - 1;
ret = max(ret, height[top] * width);
}
}
return ret;
}
};
st棧底保存的是當前遍元素歷記錄中的最小值,最小值之後的元素(比最小值大)所形成的各種面積可以通過出棧解決。而最小值形成的面積寬度爲i,也可以輕易求出面積。
2.對於2D面板可以看作多個一維數組,高度向下。
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix) {
int row = matrix.size();
if(row == 0) return 0;
int col = matrix[0].size();
for(int i = row - 1; i > 0 ; i--) {
for(int j = 0; j < col; j++) {
if(matrix[i][j] != '0' && matrix[i-1][j] != '0')
matrix[i-1][j] += (matrix[i][j] - '0');
}
}
int ret = 0;
for(int i = 0; i < row; i++) {
ret = max(ret, largestRectangleArea(matrix[i]));
}
return ret;
}
};