当前位置:   article > 正文

LeetCode·85.最大矩形·单调栈_leetcode85

leetcode85

链接:https://leetcode.cn/problems/maximal-rectangle/solution/by-xun-ge-v-zhxr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

题目

 

示例

 

思路

解题思路
本题与84题思路大体相同,是84题的进阶题,可以移步先看看84题
84.题解
84题是在一维空间求最大矩形,本题是在二维空间求矩形,思路一样,可以将二维空间转换为一维空间与84题一模一样

 

 

暴力求解:
我们按照题目给定要求,枚举数组每一个元素,将对应的高和宽相乘组成面积,保存最大面积即可,因为给定为字符串,所以先对其进行处理,转换为二维整形数组,同时求其在Y方向的高

单调栈+哨兵:
通过暴力解法,时间消耗非常大
那么可以利用递增栈优化暴力暴力求解的过程

  • 当元素大于栈顶元素时,入栈
  • 当元素小于栈顶元素时,维护栈的递增性,将小于当前元素的栈顶元素弹出,并计算面积

在上面递增栈中,我们总是需要判断当前元素是否为最后元素或者为栈顶元素,很麻烦,那么可以在数组前后加上两个哨兵,充当坏点,在实际计算中不影响结果,但是简化我们的逻辑,正如我们高中或者初中学过的辅助线或者凑配法都是差不多的思路

具体实现看代码,注释超级详细

代码

暴力求解:

  1. int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){
  2. int dp[matrixSize][matrixColSize[0]];
  3. memset(dp, 0, sizeof(dp));
  4. for(int i = 0; i < matrixSize; i++)//计算对应高度
  5. {
  6. for(int j = 0; j < matrixColSize[0]; j++)
  7. {
  8. if(matrix[i][j] == '1')
  9. {
  10. dp[i][j] = (i == 0 ? 0 : dp[i-1][j])+1;
  11. }
  12. }
  13. }
  14. int max = 0;
  15. for(int i = 0; i < matrixSize; i++)
  16. {
  17. for(int j = 0; j < matrixColSize[0]; j++)//计算每一个点能构成的最大面积
  18. {
  19. if(matrix[i][j] == '0')
  20. {
  21. continue;
  22. }
  23. int min = dp[i][j];//
  24. for(int k = j; k >= 0; k--)
  25. {
  26. if(matrix[i][k] == '0')
  27. {
  28. break;
  29. }
  30. min = fmin(min, dp[i][k]);//每次保存最小高
  31. max = fmax(max, (j - k + 1) * min);
  32. }
  33. }
  34. }
  35. return max;
  36. }
  37. 作者:xun-ge-v
  38. 链接:https://leetcode.cn/problems/maximal-rectangle/solution/by-xun-ge-v-zhxr/
  39. 来源:力扣(LeetCode)
  40. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

单调栈+哨兵: 

  1. int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){
  2. int dp[matrixSize][matrixColSize[0] + 2];//添加哨兵
  3. memset(dp, 0, sizeof(dp));//初始化
  4. for(int i = 0; i < matrixSize; i++)//计算对应高度
  5. {
  6. for(int j = 0; j < matrixColSize[0]; j++)
  7. {
  8. if(matrix[i][j] == '1')
  9. {
  10. dp[i][j+1] = (i == 0 ? 0 : dp[i-1][j+1])+1;
  11. }
  12. }
  13. }
  14. int max = 0;
  15. for(int i = 0; i < matrixSize; i++)//转为一维,
  16. {
  17. int stack[matrixColSize[0]+2];//单调栈解法
  18. int top = -1;
  19. stack[++top] = 0;
  20. for(int j = 1; j < matrixColSize[0]+2; j++)
  21. {
  22. while(dp[i][j] < dp[i][stack[top]])
  23. {
  24. max = fmax(max, (j - stack[top-1] - 1) * dp[i][stack[top]]);
  25. --top;
  26. }
  27. stack[++top] = j;
  28. }
  29. }
  30. return max;
  31. }
  32. 作者:xun-ge-v
  33. 链接:https://leetcode.cn/problems/maximal-rectangle/solution/by-xun-ge-v-zhxr/
  34. 来源:力扣(LeetCode)
  35. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/380529
推荐阅读
相关标签
  

闽ICP备14008679号