当前位置:   article > 正文

leetcode85:最大矩形

leetcode85

85. 最大矩形 - 力扣(LeetCode) (leetcode-cn.com)

这道题是非常有难度的,起初我以为是前缀和,但是这样的话得暴力搜索,时间复杂度是o(n^4),最坏情况要技术按1.6*10^9次,这个数字是非常离谱的,然后想了想发现一个新的方法,和leetcode84非常像,而且因为n是在[1,200]内的,所以我们只需要把时间复杂度控制在o(n^3)即可,具体的思路如下:

1:我们可以把矩形看作是柱状图,我们依次计算由0~k行组成的柱状图中最大的矩形面积即可。

如下图

 

 有了思路,那么接下来就是具体代码实现了

  1. const int N=210;
  2. class Solution {
  3. public:
  4. int st[N]={0};//st存储当前行数的柱状图高低
  5. int max(int a,int b){
  6. return a>b?a:b;
  7. }
  8. int maximalRectangle(vector<vector<char>>& matrix) {
  9. int max1=0;
  10. for(int i=0;i<matrix.size();i++){//枚举行
  11. for(int j=0;j<matrix[i].size();j++){//更新柱状图
  12. if((matrix[i][j]-'0'!=0&&st[j]!=0)||(i==0&&matrix[i][j]-'0'!=0)) st[j]++;
  13. else if(matrix[i][j]-'0'!=0) st[j]=1;
  14. else st[j]=0;
  15. }
  16. for(int j=0;j<matrix[i].size();j++){//暴力搜索最大矩形
  17. int mid=0;
  18. for(int k=j;k<matrix[i].size();k++){
  19. if(st[j]<=st[k]) mid+=st[j];
  20. else break;
  21. }
  22. if(j>0)//防止下标越界
  23. for(int k=j-1;k>=0;k--){
  24. if(st[j]<=st[k]) mid+=st[j];
  25. else break;
  26. }
  27. max1=max(max1,mid);
  28. }
  29. }
  30. return max1;
  31. }
  32. };

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

闽ICP备14008679号