力扣85题最大矩形题解

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例 1:


输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:6
解释:最大矩形如上图所示。
示例 2:

输入:matrix = []
输出:0
示例 3:

输入:matrix = [["0"]]
输出:0
示例 4:

输入:matrix = [["1"]]
输出:1
示例 5:

输入:matrix = [["0","0"]]
输出:0

其实这道题完全就是基于84最大柱形面积的一道拓展题(虽然我也是看了题解才想到怎么将两者联系到一起。)

对于这个最大矩形,我们完全可以把它看作是对于每一行当前列的最大柱形面积的求解。具体代码如下。

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
      if(matrix.size()==0||matrix[0].size()==0){
          return 0;
      }
      int row=matrix.size();
      int col=matrix[0].size();
      vector<int>heights(col,0);
      int ans=-1e5;

      for(int i=0;i<row;i++){
          for(int j=0;j<col;j++){
              if(matrix[i][j]=='1'){
                  heights[j]++;
              }
              else heights[j]=0;
          }
         ans=max(ans,largestRectangleArea(heights)); 
      }
      return ans;
    }
   
    int largestRectangleArea(vector<int>heights) {
    heights.push_back(0);
    stack<int>stk;
    int maxArea=0;
    for(int i=0;i<heights.size();i++){
        while(!stk.empty()&&heights[i]<heights[stk.top()]){
            int top=stk.top();
            stk.pop();
            maxArea=max(maxArea,heights[top]*(stk.empty()?i:i-1-stk.top()));
        }
        stk.push(i);
    }
    return maxArea;
    }
};

简单通俗易懂,一道假困难吧。

猜你喜欢

转载自blog.csdn.net/qq_62440805/article/details/124889997