【LeetCode】85. Maximal Rectangle(C++)

地址:https://leetcode.com/problems/maximal-rectangle/

题目:

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:
【LeetCode】85. Maximal Rectangle(C++)_第1张图片

理解:

找出给定的矩阵里全1的矩形的最大区域。

实现1:

参考:Share my DP solution
采用dp的思想进行扫描。对于每行

  • 如果某个位置为0,则重置矩形高度;否则,高度为上一行的高度+1
  • 从左到右,保存当前连续1的起始位置,当前位置的连1起始位置为上一行的连1的起始位置和本行目前连1起始位置的较大值;
  • 从右到左,保存当前连续1的终止位置+1。当前位置的终止位置,为本行和上一行的终止位置中的较小值。
  • 从左到右计算目前行的最大面积。
class Solution {
public:
	int maximalRectangle(vector<vector<char>>& matrix) {
		if (matrix.empty()) return 0;
		const int m = matrix.size();
		const int n = matrix[0].size();
		vector<int> left(n, 0), right(n, n), height(n, 0);
		int maxArea = 0;
		for (int i = 0; i < m; i++) {
			int curr_left = 0, curr_right = n;
			for (int j = 0; j < n; ++j) {
				if (matrix[i][j] == '1')
					height[j]++;
				else
					height[j] = 0;
			}
			for (int j = 0; j < n; j++) {
				if (matrix[i][j] == '1') {
					left[j] = max(left[j], curr_left);
				}
				else {
					left[j] = 0;
					curr_left = j + 1;
				}
			}
			for (int j = n - 1; j >= 0; j--) {
				if (matrix[i][j] == '1') {
					right[j] = min(right[j], curr_right);
				}
				else {
					right[j] = n;
					curr_right = j;
				}
			}
			for (int j = 0; j < n; j++)
				maxArea = max(maxArea, (right[j] - left[j])*height[j]);
		}
		return maxArea;
	}
};

实现2:

利用84. Largest Rectangle in Histogram题的方法作为辅助。扫描每行,并生成柱状图。其中如果本行为1,柱状图的高度就是上一行的高度加1,否则就是0。

class Solution {
public:
	int maximalRectangle(vector<vector<char>>& matrix) {
		if (matrix.empty()) return 0;
		int m = matrix.size();
		int n = matrix[0].size();
		vector<int> h(n+1, 0);
		int maxArea = 0;
		for (int i = 0; i < m; ++i) {
			stack<int> stk;
			for (int j = 0; j <= n; ++j) {
				if (j < n&&matrix[i][j] == '1')
					h[j]++;
				else
					h[j] = 0;
				if (stk.empty() || h[stk.top()] <= h[j])
					stk.push(j);
				else {
					while (!stk.empty() && h[stk.top()] > h[j]) {
						int heightIndex = stk.top();
						stk.pop();
						int r = j - 1;
						int l = stk.empty() ? 0 : stk.top() + 1;
						int width = r - l + 1;
						maxArea = max(maxArea, h[heightIndex] * width);
					}
					stk.push(j);
				}
			}
		}
		return maxArea;
	}
};

你可能感兴趣的:(LeetCode)