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,一个存上一轮的结果,一个用来更新出这一轮的结果,每次扫描上一轮,统计一个字符出现的次数,然后把这个次数和字符增加到这一轮的字符串中就 ...
随机推荐
- Python CSV文件处理/读写及With as 用法
可以不使用CSV模块 逐行处理: for line in open("samples/sample.csv"): title, year, director = line.spli ...
- BZOJ 1739: [Usaco2005 mar]Space Elevator 太空电梯
题目 1739: [Usaco2005 mar]Space Elevator 太空电梯 Time Limit: 5 Sec Memory Limit: 64 MB Description The c ...
- linux 进程间信号量管理程序之sem_timedwait使用
在开发过程中,有三个独立执行的程序模块,三个模块都对sqlite数据库进行读写操作.sqlite在linux共享性较差,所以须要增加相互排斥信号量解决三个模块訪问数据库该问题. 另外,在增加信号量后, ...
- Cocos2d_x的特点及环境配置
Cocos2d_x的特点: 什么是"x"?Cocos2d_x方式:有时候我们写的cpp文件扩展,CXX."X"标致着该项目是由c++,并提供c++中的API编写 ...
- 【Linux命令】数据库mysql配置命令
# 检查MySQL服务器系统进程 ~ ps -aux|grep mysql mysql 1103 0.0 0.3 492648 51780 ? Ssl 14:04 0:21 /usr/sbin/mys ...
- BZOJ 1856: [Scoi2010]字符串( 组合数 )
求(0,0)->(n,m)且在直线y=x下方(可以在y=x上)的方案数...同 http://www.cnblogs.com/JSZX11556/p/4908648.html --------- ...
- python命令行解析工具argparse模块【4】
上一节我们讲解了add_argument()方法,这一节我们将学习parse_args()方法. parse_args()方法的作用是解析命令行参数,并返回解析之后的 ...
- Python网络编程——主机字节序和网络字节序之间的相互转换
If you ever need to write a low-level network application, it may be necessary to handle the low-lev ...
- Python网络编程——获取远程设备的IP地址
有时需要把设备的主机名转换成对应的IP地址,下面是一个简单的操作. import socket def get_remote_machine_info(): # 定义get_remote_machin ...
- hdu 4465 Candy 2012 成都现场赛
/** 对于大数的很好的应用,,缩小放大,,保持精度 **/ #include <iostream> #include <cmath> #include <algorit ...