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的更多相关文章

  1. 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 ...

  2. leetcode@ [84/85] Largest Rectangle in Histogram & Maximal Rectangle

    https://leetcode.com/problems/largest-rectangle-in-histogram/ https://leetcode.com/problems/maximal- ...

  3. 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 ...

  4. Maximal Rectangle&Largest Rectangle in Histogram

    这两天在做leetcode的题目,最大矩形的题目以前遇到很多次了,一直都是用最笨的方法,扫描每个柱子,变换宽度,计算矩形面积,一直都以为就这样O(n2)的方法了,没有想到居然还有研究出了O(n)的算法 ...

  5. [LeetCode] Largest Rectangle in Histogram O(n) 解法详析, Maximal Rectangle

    Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...

  6. LeetCode 84--柱状图中最大的矩形( Largest Rectangle in Histogram) 85--最大矩形(Maximal Rectangle)

    84题和85五题 基本是一样的,先说84题 84--柱状图中最大的矩形( Largest Rectangle in Histogram) 思路很简单,通过循环,分别判断第 i 个柱子能够延展的长度le ...

  7. [LeetCode] Largest Rectangle in Histogram 直方图中最大的矩形

    Given n non-negative integers representing the histogram's bar height where the width of each bar is ...

  8. 84. Largest Rectangle in Histogram

    https://www.cnblogs.com/grandyang/p/4322653.html 1.存储一个单调递增的栈 2.如果你不加一个0进去,[1]这种情况就会输出结果0,而不是1 3.单调递 ...

  9. [LeetCode] 84. Largest Rectangle in Histogram 直方图中最大的矩形

    Given n non-negative integers representing the histogram's bar height where the width of each bar is ...

随机推荐

  1. sprintf函数

    sprintf函数用法举例 #include<stdio.h> int main() { //1.连接字符串 char a1[] = {'A', 'B', 'C', 'D', 'E', ' ...

  2. mysql 中execute、executeQuery和executeUpdate之间的区别

    在用纯JSP做一个页面报警功能的时候习惯性的用executeQuery来执行SQL语句,结果执行update时就遇到问题,语句能执行,但返回结果出现问题,另外还忽略了executeUpdate的返回值 ...

  3. java面试准备之基础排序——冒泡与选择排序

    选择排序:     [java]    public void select(int[] arr){            for(int i=0;i<arr.length;i++){      ...

  4. 微信公众平台开发接口PHP SDK完整版(转载)

    <?php/*    方倍工作室 http://www.fangbei.org/    CopyRight 2015 All Rights Reserved*/ define("TOK ...

  5. js从后台无法取值问题

    前台代码 <script type="text/javascript"> $(function () { var chart; $(document).ready(fu ...

  6. 【转载】【Windows批处理IV】批量进行文件重命名

    1.过滤文件名中所有数字.汉字.特殊字符(含空格) @echo off for %%a in (*.*) do ( if "%%~nxa" neq "%~nx0" ...

  7. tensorflow4

    参考:tensorflow_manual_cn.pdf 一.图像的四维张量和参数的四维张量貌似不同: 二.流程回顾 1.数据准备 2.Page 63 三.状态可视化 四.保存检查点(保存参数) 五.评 ...

  8. Java 设计一个贷款计算器 简易

    import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.border.*; publi ...

  9. Thrift 个人实战--Thrift 网络服务模型

    前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还 ...

  10. Java:String和Date、Timestamp之间的转换

    一.String与Date(java.util.Date)互转 1.1 String -> Date String dateStr = "2016-9-28 12:25:55" ...