Maximal Rectangle (求矩阵的最大的子矩阵) 【面试算法leetcode】
2013-09-21 17:37
423 查看
题目:
Given
a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
题意有一个01组成的矩阵,找到其中面积最大的,全部由1构成的子矩阵。
去年做多校比赛的时候第一次见到这题,不优化到O(n×n)死活过不了当时。
优化就是先预处理成保存成,当前点向上都是1的最高的高度,就变成每一行都是一个直方图,
之后用O(n)的直方图求最大面积去算,之前一篇文章 http://blog.csdn.net/havenoidea/article/details/11854723
介绍过这个步骤,就不细说。
Given
a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
题意有一个01组成的矩阵,找到其中面积最大的,全部由1构成的子矩阵。
去年做多校比赛的时候第一次见到这题,不优化到O(n×n)死活过不了当时。
优化就是先预处理成保存成,当前点向上都是1的最高的高度,就变成每一行都是一个直方图,
之后用O(n)的直方图求最大面积去算,之前一篇文章 http://blog.csdn.net/havenoidea/article/details/11854723
介绍过这个步骤,就不细说。
int height[1000][1000]; class Solution { public: int maximalRectangle(vector<vector<char> > &matrix) { int i,j,k,row,col,maxx=0; row=matrix.size(); if(row==0)return 0; col=matrix[0].size(); if(col==0)return 0; for(j=0;j<col;++j) for(i=0;i<row;++i) if(matrix[i][j]=='0')height[i][j]=0; else if(i==0)height[0][j]=1; else height[i][j]=height[i-1][j]+1; stack<int>s; for(i=0;i<row;++i) { for(j=0;j<col;++j) { if(s.empty())s.push(j); else { while(!s.empty()&&height[i][s.top()]>height[i][j]) { int ph=s.top(); s.pop(); if(!s.empty()) maxx=max(maxx,(j-s.top()-1)*height[i][ph]); else maxx=max(maxx,j*height[i][ph]); } s.push(j); } } while(!s.empty()) { int ph=s.top(); s.pop(); if(!s.empty()) maxx=max(maxx,(col-s.top()-1)*height[i][ph]); else maxx=max(maxx,col*height[i][ph]); } } return maxx; } };
相关文章推荐
- JAVA代码—算法基础:最大子矩阵的和(N*N的矩阵)
- 笔试面试算法经典--动态规划-最大子矩阵和(Java)
- 【LeetCode-面试算法经典-Java实现】【074-Search a 2D Matrix(搜索二维矩阵)】
- 【LeetCode-面试算法经典-Java实现】【053-Maximum Subarray(最大子数组和)】
- 【LeetCode-面试算法经典-Java实现】【05-Longest Palindromic Substring(最大回文字符串)】
- 【LeetCode-面试算法经典-Java实现】【152-Maximum Product Subarray(子数组的最大乘积)】
- 【LeetCode-面试算法经典-Java实现】【053-Maximum Subarray(最大子数组和)】
- leetcode:Maximum Subarray(最大的连续子数组) 【面试算法】
- 【LeetCode-面试算法经典-Java实现】【104-Maximum Depth of Binary Tree(二叉树的最大深度)】
- 【LeetCode-面试算法经典-Java实现】【05-Longest Palindromic Substring(最大回文字符串)】
- 【LeetCode-面试算法经典-Java实现】【104-Maximum Depth of Binary Tree(二叉树的最大深度)】
- 【左神算法课】二维矩阵的子矩阵最大累加和
- leetcode直方图的最大矩阵算法
- 求一个矩阵最大子矩阵的算法模板
- 【LeetCode-面试算法经典-Java实现】【070-Set Matrix Zeroes(矩阵置零)】
- 【LeetCode-面试算法经典-Java实现】【004-Median of Two Sorted Arrays(两个排序数组的中位数)】
- 二叉树的最大深度算法面试题-leetcode学习之旅(3)
- 【LeetCode-面试算法经典-Java实现】【139-Word Break(单词拆分)】
- HDU 1559 最大子矩阵--dp--(最大和子矩阵模型)
- 【LeetCode-面试算法经典-Java实现】【106-Construct Binary Tree from Inorder and Postorder Traversal(构造二叉树II)】