47. Largest Rectangle in Histogram && Maximal Rectangle
Largest Rectangle in Histogram
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

The largest rectangle is shown in the shaded area, which has area = 10 unit.
For example, Given height = [2,1,5,6,2,3], return 10.
思路: 注意一点: 只要计算出以每个柱形为最小值的矩形面积即可。使用一个栈,栈内始终保存一个递增序列的 index,若是 新的柱形长度小于栈顶元素,则退出栈顶直到栈内元素的长度不大于新的柱形的长度为止,并且,对于每一个退栈元素,计算以其长度为最小值的面积。(宽的左边为其自身位置,右边为新到元素的位置)时间:O(n)
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
int n = height.size(), max_area = 0;
int Id, area;
int i = 0;
stack<int> st; // save the index
while(i < n) {
if(st.empty() || height[i] >= height[st.top()]) st.push(i++);
else {
Id = st.top();
st.pop();
area = height[Id] * (st.empty() ? i : i - st.top() - 1);
if(area > max_area) max_area = area;
}
}
while(!st.empty()) {
Id = st.top();
st.pop();
area = height[Id] * (st.empty() ? i : i - st.top() - 1);
if(area > max_area) max_area = area;
}
return max_area;
}
};
Maximal Rectangle
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
思路: 一行一行的记录下当前高度, 用上题的思路计算一下,即可。时间: O(n2)
int getMaxArea(vector<int> &h) {
stack<int> st;
int maxArea, i = 0;
while(i < h.size()) {
if(st.empty() || h[st.top()] <= h[i]) { st.push(i++); continue; }
while(!st.empty() && h[st.top()] > h[i]) {
int id = st.top();
st.pop();
int area = h[id] * (st.empty() ? i : i - st.top() - 1);
if(area > maxArea) maxArea = area;
}
}
while(!st.empty()) {
int id = st.top();
st.pop();
int area = h[id] * (st.empty() ? i : i - st.top() - 1);
if(area > maxArea) maxArea = area;
}
return maxArea;
}
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0) return 0;
int row = matrix.size(), col = matrix[0].size();
vector<int> h(row, 0);
int maxArea = 0;
for(int c = 0; c < col; ++c) {
for(int r = 0; r < row; ++r) {
if(matrix[r][c] == '1') ++h[r];
else h[r] = 0;
}
maxArea = max(maxArea, getMaxArea);
}
return maxArea;
}
};
47. Largest Rectangle in Histogram && Maximal Rectangle的更多相关文章
- LeetCode之“动态规划”:Maximal Square && Largest Rectangle in Histogram && Maximal Rectangle
1. Maximal Square 题目链接 题目要求: Given a 2D binary matrix filled with 0's and 1's, find the largest squa ...
- leetcode@ [84/85] Largest Rectangle in Histogram & Maximal Rectangle
https://leetcode.com/problems/largest-rectangle-in-histogram/ https://leetcode.com/problems/maximal- ...
- 84. Largest Rectangle in Histogram *HARD* -- 柱状图求最大面积 85. Maximal Rectangle *HARD* -- 求01矩阵中的最大矩形
1. Given n non-negative integers representing the histogram's bar height where the width of each bar ...
- Maximal Rectangle&Largest Rectangle in Histogram
这两天在做leetcode的题目,最大矩形的题目以前遇到很多次了,一直都是用最笨的方法,扫描每个柱子,变换宽度,计算矩形面积,一直都以为就这样O(n2)的方法了,没有想到居然还有研究出了O(n)的算法 ...
- [LeetCode] Largest Rectangle in Histogram O(n) 解法详析, Maximal Rectangle
Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...
- LeetCode 84--柱状图中最大的矩形( Largest Rectangle in Histogram) 85--最大矩形(Maximal Rectangle)
84题和85五题 基本是一样的,先说84题 84--柱状图中最大的矩形( Largest Rectangle in Histogram) 思路很简单,通过循环,分别判断第 i 个柱子能够延展的长度le ...
- [LeetCode] Largest Rectangle in Histogram 直方图中最大的矩形
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- 84. Largest Rectangle in Histogram
https://www.cnblogs.com/grandyang/p/4322653.html 1.存储一个单调递增的栈 2.如果你不加一个0进去,[1]这种情况就会输出结果0,而不是1 3.单调递 ...
- [LeetCode] 84. Largest Rectangle in Histogram 直方图中最大的矩形
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
随机推荐
- android 第一个程序的编写
移通152余继彪 需求分析:输入两个数字,让他们相乘,然后得出结果 首先建立一个android项目 在 layout中建立第一个界面 该界面有四个组件,两个editText 一个TextView,一个 ...
- GUI用户界面编程
Java的GUI编程(Graphic User Interface,图形用户接口),是在它的抽象窗口工具箱(Abstract Window Toolkit,AWT)上实现的,java.awt是AWT的 ...
- 循环打印i值(面试题)
/* * 下面的代码,为了实现每隔1秒说一句话, * 找出存在的问题,并改正,然后描述一下你的解决方案. * */ var arr = [ '第一句话', '第二句话', '第三句话', '第四句话' ...
- 北大poj-1062
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 43523 Accepted: 12760 Descripti ...
- node.js在linux下的安装
简单说就是解压后,在bin文件夹中已经存在node以及npm,如果你进入到对应文件的中执行命令行一点问题都没有,不过不是全局的,所以将这个设置为全局就好了. ? 1 2 3 cd node-v0.10 ...
- reverse-XNUCA-babyfuscator
上一次线上赛的一道题目 链接:http://pan.baidu.com/s/1qY9ztKC 密码:xlr2 这是一道代码混淆的题目,因为当时还不知道angr这样一个软件,所以我就用了自己的一种思路 ...
- WPF学习笔记——认识XAML
Extensible Application Markup Language,XAML是一种声明性标记语言. 一.XAML语法概述 1,与XML类似,用尖括号标记元素 <StackPanel&g ...
- LNMP服务器虚拟主机管理lnmp
安装 系统需求: 需要2 GB硬盘剩余空间 安装步骤: 1.使用putty或类似的SSH工具登陆:登陆后运行:screen -S lnmp如果提示screen命令不存在可以执行:yum install ...
- Docker之Web-UI
DockerUI 不支持多主机Command: docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock dock ...
- 需求文档2_The Battle of Polytopia
需求文档 ------------------------------------- 1. 游戏详细分析 The Battle of Polytopia简要介绍 探索型.策略型的对战塔防游戏,回合制. ...