【LeetCode】85. 最大矩形 結題報告 (C++)
阿新 • • 發佈:2018-11-11
原題地址:https://leetcode-cn.com/problems/maximal-rectangle/description/
題目描述:
給定一個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。
示例:
輸入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
輸出: 6
解題方案:
參考連結:https://blog.csdn.net/LaputaFallen/article/details/79869806
class Solution { public: int maximalRectangle(vector<vector<char>>& matrix) { if(matrix.empty()) return 0; int m = matrix.size(); int n = matrix[0].size(); int left[n], right[n], height[n]; fill_n(left, n, 0); fill_n(right, n, n); fill_n(height, n, 0); int maxA = 0; for(int i = 0; i < m; i ++) { int cur_left = 0, cur_right = n; for(int j = 0; j < n; j ++) { // compute height (can do this from either side) if(matrix[i][j] == '1') height[j] ++; else height[j] = 0; } for(int j = 0; j < n; j ++) { // compute left (from left to right) if(matrix[i][j] == '1') left[j] = max(left[j], cur_left); else { left[j] = 0; cur_left = j + 1; } } for(int j = n - 1; j >= 0; j --) { // compute right (from right to left) if(matrix[i][j] == '1') right[j] = min(right[j], cur_right); else { right[j]=n; cur_right=j; } } // compute the area of rectangle (can do this from either side) for(int j = 0; j < n; j ++) maxA = max(maxA, (right[j] - left[j]) * height[j]); } return maxA; } };