博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
47. Largest Rectangle in Histogram && Maximal Rectangle
阅读量:4933 次
发布时间:2019-06-11

本文共 2753 字,大约阅读时间需要 9 分钟。

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
&height) { int n = height.size(), max_area = 0; int Id, area; int i = 0; stack
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
&h) { stack
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
> &matrix) { if(matrix.size() == 0 || matrix[0].size() == 0) return 0; int row = matrix.size(), col = matrix[0].size(); vector
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; }};

 

转载于:https://www.cnblogs.com/liyangguang1988/p/3954064.html

你可能感兴趣的文章
51CTO大赛,欢迎投博主一票
查看>>
FlashCS5作成SWC,在Flex4中使用(1)
查看>>
vue-cli目录结构及说明
查看>>
JS 数据类型转换
查看>>
WeQuant交易策略—RSI
查看>>
osgearth将视点绑定到一个节点上
查看>>
PHP 当前时间秒数+数值,然后再转换成时间。
查看>>
数据交互 axios 的使用
查看>>
bootloader,kernel,initrc
查看>>
Java中jshell脚本
查看>>
performSelector的方法
查看>>
redis
查看>>
BZOJ1645 [Usaco2007 Open]City Horizon 城市地平线
查看>>
配置IIS
查看>>
单例模式详解
查看>>
电商项目(下)
查看>>
[NOIP2015] 子串
查看>>
NSSet和NSArray区别与方法总结
查看>>
Python列表 元组 字典 集合
查看>>
foreach遍历数组、数组的转置与方阵的迹
查看>>