赞
踩
链接:https://leetcode.cn/problems/maximal-rectangle/solution/by-xun-ge-v-zhxr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
解题思路
本题与84题思路大体相同,是84题的进阶题,可以移步先看看84题
84.题解
84题是在一维空间求最大矩形,本题是在二维空间求矩形,思路一样,可以将二维空间转换为一维空间与84题一模一样
暴力求解:
我们按照题目给定要求,枚举数组每一个元素,将对应的高和宽相乘组成面积,保存最大面积即可,因为给定为字符串,所以先对其进行处理,转换为二维整形数组,同时求其在Y方向的高
单调栈+哨兵:
通过暴力解法,时间消耗非常大
那么可以利用递增栈优化暴力暴力求解的过程
在上面递增栈中,我们总是需要判断当前元素是否为最后元素或者为栈顶元素,很麻烦,那么可以在数组前后加上两个哨兵,充当坏点,在实际计算中不影响结果,但是简化我们的逻辑,正如我们高中或者初中学过的辅助线或者凑配法都是差不多的思路
具体实现看代码,注释超级详细
暴力求解:
- int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){
- int dp[matrixSize][matrixColSize[0]];
- memset(dp, 0, sizeof(dp));
- for(int i = 0; i < matrixSize; i++)//计算对应高度
- {
- for(int j = 0; j < matrixColSize[0]; j++)
- {
- if(matrix[i][j] == '1')
- {
- dp[i][j] = (i == 0 ? 0 : dp[i-1][j])+1;
- }
- }
- }
- int max = 0;
- for(int i = 0; i < matrixSize; i++)
- {
- for(int j = 0; j < matrixColSize[0]; j++)//计算每一个点能构成的最大面积
- {
- if(matrix[i][j] == '0')
- {
- continue;
- }
- int min = dp[i][j];//高
- for(int k = j; k >= 0; k--)
- {
- if(matrix[i][k] == '0')
- {
- break;
- }
- min = fmin(min, dp[i][k]);//每次保存最小高
- max = fmax(max, (j - k + 1) * min);
- }
- }
- }
- return max;
- }
-
- 作者:xun-ge-v
- 链接:https://leetcode.cn/problems/maximal-rectangle/solution/by-xun-ge-v-zhxr/
- 来源:力扣(LeetCode)
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
单调栈+哨兵:
- int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){
- int dp[matrixSize][matrixColSize[0] + 2];//添加哨兵
- memset(dp, 0, sizeof(dp));//初始化
- for(int i = 0; i < matrixSize; i++)//计算对应高度
- {
- for(int j = 0; j < matrixColSize[0]; j++)
- {
- if(matrix[i][j] == '1')
- {
- dp[i][j+1] = (i == 0 ? 0 : dp[i-1][j+1])+1;
- }
- }
- }
- int max = 0;
- for(int i = 0; i < matrixSize; i++)//转为一维,
- {
- int stack[matrixColSize[0]+2];//单调栈解法
- int top = -1;
- stack[++top] = 0;
- for(int j = 1; j < matrixColSize[0]+2; j++)
- {
- while(dp[i][j] < dp[i][stack[top]])
- {
- max = fmax(max, (j - stack[top-1] - 1) * dp[i][stack[top]]);
- --top;
- }
- stack[++top] = j;
- }
- }
- return max;
- }
-
-
- 作者:xun-ge-v
- 链接:https://leetcode.cn/problems/maximal-rectangle/solution/by-xun-ge-v-zhxr/
- 来源:力扣(LeetCode)
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。