leetcode第一刷_Maximal Rectangle
这个题比刚才那个更难。
假设没做过上一个,这个简直是无情。
先想一个笨笨的解法,如何确定一个矩形呢?找一个左上角,然后每行的看能延伸到什么位置。注意随着行数的添加,列数是仅仅能变短,不能变长。
想一下也知道这样的方法的复杂度有多高。超时无疑。
假设刚好做了这个求柱形的题目。会不会收到启示呢。将矩阵中的每个1都看做是一个小的正方形。在每一列,连续的1就构成了一个柱体。求一连串这种柱体围成的最大面积就是全部1构成的最大矩形,问题被完美转化。
尽管在我看来。这种转化是非常不easy的,要不是这两个题目相邻。太难想到了。
这给了我们非常好的教训,不同的形状之间或许存在着某种联系。
置于怎么构造这种柱形就简单的多了,每一行都须要计算。看当前行当前列是1还是0,是1的话在上一行相应列的基础上长高1,是0的话直接就是0了。返回最大的面积。
class Solution {
public:
int largestArea(int *height, int length){
stack<int> s;
int i=0, res=0, tpres, tph;
while(i<length){
if(s.empty()||height[s.top()]<=height[i]){
s.push(i++);
}else{
tph = height[s.top()];
s.pop();
tpres = tph*(s.empty()?i:i-s.top()-1);
res = max(res, tpres);
}
}
while(!s.empty()){
tph = height[s.top()];
s.pop();
tpres = tph*(s.empty()?i:i-s.top()-1);
res = max(res, tpres);
}
return res;
}
int maximalRectangle(vector<vector<char> > &matrix) {
int m = matrix.size();
if(m == 0) return 0;
int n = matrix[0].size();
int **h = new int*[m];
for(int i=0;i<m;i++){
h[i] = new int[n];
memset(h[i], 0, sizeof(int)*n);
}
for(int j=0;j<n;j++){
if(matrix[0][j] == '1'){
++h[0][j];
}
}
for(int i=1;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j] == '1'){
h[i][j] = h[i-1][j]+1;
}
}
}
int res = 0;
for(int i=0;i<m;i++){
res = max(res, largestArea(h[i], n));
delete [] h[i];
}
delete [] h;
return res;
}
};
leetcode第一刷_Maximal Rectangle的更多相关文章
- leetcode第一刷_Largest Rectangle in Histogram
非常难的问题,数组线性时间. 属于我之前说的解法的借助辅助空间.给定两个柱子,他们之间的面积由什么确定呢?没错,他们之间的距离和他们之间最矮的那个柱子的高度.我们并不知道这个柱子在什么位置,所以仅仅能 ...
- leetcode第一刷_Set Matrix Zeroes
这个题乍一看非常easy,实际上还挺有技巧的.我最開始的想法是找一个特殊值标记.遇到一个0,把他所相应的行列中非零的元素标记成这个特殊值.0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0. 问题 ...
- leetcode第一刷_Permutations II
当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...
- leetcode第一刷_Populating Next Right Pointers in Each Node II
很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...
- leetcode第一刷_Merge Intervals
看到这个题我就伤心啊,去微软面试的时候,第一个面试官让我做的题目就是实现集合的交操作,这个集合中的元素就像这里的interval一样.是一段一段的.当时写的那叫一个慘不忍睹.最后果然被拒掉了. .好好 ...
- leetcode第一刷_N-Queens
八皇后问题应该是回溯法的教学典范.在本科的时候,有一门课叫面向对象.最后的附录有这个问题的源码.当时根本不懂编程,照抄下来,执行一下出了结果都非常开心,哎. 皇后们的限制条件是不能同行同列,也不能同对 ...
- leetcode第一刷_Gray Code
说到格雷码,应该没人不知道,详细它有什么用,我还真不是非常清楚,我室友应该是专家.生成的规律不是非常明显,之前看到帖子讲的,这会儿找找不到了.. 思想是这种,假设有n位,在第2^(n-1)个编码以下画 ...
- leetcode第一刷_Combination Sum Combination Sum II
啊啊啊啊.好怀念这样的用递归保存路径然后打印出来的题目啊.好久没遇到了. 分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的.事实上没有多大差别,第一种每次进入递归的时候都要从头 ...
- leetcode第一刷_Count and Say
水题. 描写叙述的还挺麻烦的,实际上就是纸老虎,用两个string,一个存上一轮的结果,一个用来更新出这一轮的结果,每次扫描上一轮,统计一个字符出现的次数,然后把这个次数和字符增加到这一轮的字符串中就 ...
随机推荐
- tcpdump抓包并保存成cap文件
首选介绍一下tcpdump的常用参数 tcpdump采用命令行方式,它的命令格式为: tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ] [ -i 网络接 ...
- haproxy 超时机制
<pre name="code" class="python">option redispatch option redispatch 是否允许重新 ...
- A2W和W2A :很好的多字节和宽字节字符串的转换宏
以前看<Window核心编程>,感觉多字节和宽字节之间还比较麻烦的,至少MultiByteToWideChar函数和WideCharToMultiByte函数有足够多的参数的意义让我们去理 ...
- poj 3264 Balanced Lineup(线段树、RMQ)
题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...
- JS动态增加页面上的控件实例
<input type="button" value="继续添加" onclick="append();"/ > & ...
- Linux下启用Chrome/Firefox的Java插件
JDK 已经安装好,可是浏览器执行 Java Applet 时提示需安装 Java 插件. 这时,在浏览器安装文件夹中 plugins 文件夹下创建2个重要的符号链接就可以. libnpjp2.so ...
- Spark调研笔记第2篇 - 怎样通过Sparkclient向Spark提交任务
在上篇笔记的基础上,本文介绍Sparkclient的基本配置及Spark任务提交方式. 1. Sparkclient及基本配置 从Spark官网下载的pre-built包中集成了Sparkclient ...
- [Jobdu] 题目1516 : 调整数组顺序使奇数位于偶数前面
void diffOddAndEven(int a[], int n) { , high = n - ; int pivot; while (low < high) { == && ...
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )
线段树.. --------------------------------------------------------------------------------- #include< ...
- poj 1204
http://poj.org/problem?id=1204 大意:给出一个棋盘puzzle,,和w个模式串,,在棋盘中寻找模式串..棋盘中任意一格有8个方向可以走.. 解题思路: AC自动机 + 枚 ...