84. Largest Rectangle in Histogram

https://www.cnblogs.com/grandyang/p/4322653.html

整体思路是递增不处理,当遇到减少时,计算之前所有大于当前高度的最优解。因为实际上只要遇到比你小的,就不可能以你为高度了。索引之间的差刚好能反应当前栈中高度所覆盖的区域,即宽度。

维护一个递增的栈,每次只用以当前栈的index的相对高 * 宽度,宽度就是以当前栈的index的右侧。每次计算的是一个局部最优解。

i--的目的是让比较对象一直停留在这个位置;

push 0的目的是计算所有的栈中剩下的大小;

当前比较的i,实际上只计算i左侧的最优解,所以是i - con.top() - 1,并且con.top()是递增的下一个index。

1.存储一个单调递增的栈

2.如果你不加一个0进去,[1]这种情况就会输出结果0,而不是1

3.单调递增的栈,如果遇到比栈的top小的,就要计算一次。其实可以看到,这个top,从左向top是最大的,top向右也是最大的,所以只能乘以他自己。

注意:这个地方con必须pop(),这样才能找到当前top所属于的高度所覆盖的宽度,比如当前top的值是7,pop出来后stack的top的值可能变成3,覆盖的区域是4,因为stack里面不是3、4、5这样连续的,大概率是一些间隔的。这也就是为什么后面使用i - con.top() - 1 ,而不使用i - index。

每次当前位置的height比stack的top小的,就需要计算以stack顶部的height为高度的局部最优解。

算覆盖区域的时候,必是i - con.top(),这个时候你就应该考虑是否-1。

class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> con;
int area = ;
heights.push_back();
for(int i = ;i < heights.size();i++){
if(con.empty() || heights[con.top()] < heights[i])
con.push(i);
else{
int index = con.top();
con.pop();
area = max(area,heights[index] * (con.empty() ? i : (i - con.top() - )));
i--;
}
}
return area;
}
};

85. Maximal Rectangle

http://www.cnblogs.com/grandyang/p/4322667.html

把矩形分成一行一行送入子函数获得每行的最大值,然后再比较各行的最大值获得总的最大值。每行的计算和largest rectangle in histogram是一样的。

送入的每行不是0、1组成,而是每行的高度,这样就转换成了largest rectangle in histogram的问题

class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int m = matrix.size();
if(m <= )
return ;
int n = matrix[].size();
if(n <= )
return ;
int res = ;
vector<int> input(n);
for(int i = ;i < m;i++){
for(int j = ;j < n;j++)
input[j] = (matrix[i][j] == '' ? : + input[j]);
res = max(res,maximal(input));
}
return res;
}
int maximal(vector<int> matrix){
stack<int> s;
int res = ;
matrix.push_back();
for(int i = ;i < matrix.size();i++){
if(s.empty() || matrix[s.top()] < matrix[i])
s.push(i);
else{
int num = s.top();
s.pop();
res = max(res,matrix[num] * (s.empty() ? i : (i - s.top() - )));
i--;
}
}
return res;
}
};

221. Maximal Square

https://www.cnblogs.com/grandyang/p/4550604.html 解法3

以正方形的右下角进行判断,只用判断左上角,左边和上边。

dp[i][j] 表示到达 (i, j) 位置所能组成的最大正方形的边长。

class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.empty())
return ;
if(matrix[].empty())
return ;
int res = ;
vector<vector<int> > area(matrix.size(),vector<int>(matrix[].size(),));
for(int i = ;i < matrix.size();i++){
for(int j = ;j < matrix[].size();j++){
if(i == || j == )
area[i][j] = matrix[i][j] - '';
else if(matrix[i][j] == '')
area[i][j] = min(area[i-][j-],min(area[i-][j],area[i][j-])) + ;
res = max(res,area[i][j]);
}
}
return res*res;
}
};

84. Largest Rectangle in Histogram的更多相关文章

  1. LeetCode 84. Largest Rectangle in Histogram 单调栈应用

    LeetCode 84. Largest Rectangle in Histogram 单调栈应用 leetcode+ 循环数组,求右边第一个大的数字 求一个数组中右边第一个比他大的数(单调栈 Lee ...

  2. 刷题84. Largest Rectangle in Histogram

    一.题目说明 题目84. Largest Rectangle in Histogram,给定n个非负整数(每个柱子宽度为1)形成柱状图,求该图的最大面积.题目难度是Hard! 二.我的解答 这是一个 ...

  3. 【LeetCode】84. Largest Rectangle in Histogram 柱状图中最大的矩形(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址: https://leetc ...

  4. 【LeetCode】84. Largest Rectangle in Histogram

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

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

  6. 84. Largest Rectangle in Histogram *HARD* -- 求柱状图中的最大矩形面积

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

  7. [LeetCode#84]Largest Rectangle in Histogram

    Problem: Given n non-negative integers representing the histogram's bar height where the width of ea ...

  8. LeetCode OJ 84. Largest Rectangle in Histogram

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

  9. LeetCode 84. Largest Rectangle in Histogram 直方图里的最大长方形

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

随机推荐

  1. Chart控件,chart、Series、ChartArea曲线图绘制的重要属性介绍

    先简单说一下,从图中可以看到一个chart可以绘制多个ChartArea,每个ChartArea都可以绘制多条Series.ChartArea就是就是绘图区域,可以有多个ChartArea叠加在一起, ...

  2. 【Spring】1、Spring 中的监听器 Listener

    一.接口 1.EventListener 2.HttpSessionAttributeListener   继承EventListener接口 HttpSessionAttributeListener ...

  3. 利用批处理文件删除系统托盘上的图标(适用于Windows各个版本)

    对于我这种强迫症患者来说,如果我已经删除了一些软件,但是系统托盘里面还有它,我会很难受.所以,没办法,必须想办法把它清除掉,还自己一片安宁!!!不知各位是否遇到过和我一样的问题,下面贴一段批处理文件的 ...

  4. c语言学习笔记-break

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.break使用中的注意事项 1.break如果用于循环,用来终止循环. 2.break如果用于switch,则用于终止swi ...

  5. jQuer插件满屏气泡飘落动画效果

    飘落动画效果插件引用: <script src="https://cdn.bootcss.com/JQuery-Snowfall/1.7.4/snowfall.jquery.min.j ...

  6. Immuable详解以及在React中的实战

    转载自:https://zhuanlan.zhihu.com/p/20295971, 今天看到这篇文章后情不自禁的转载过来了,我的天老爷,我看到后直接菊花一紧,这写的太好了,直接写进我心坎里了,我必须 ...

  7. React 入门学习笔记整理(四)—— 事件

    1.事件定义 React事件绑定属性的命名采用驼峰式写法,而不是小写. 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM元素的写法) 在类组件中定义函数,通过thi ...

  8. .NET代码设计简单规范

    以下转载于:http://www.it28.cn/ASPNET/825095.html 下面这个规范是我为朋友写的几点建议,写的很范,作为BLOG,愿与大家一起分享.只给出部分设计规范样例,关于.NE ...

  9. selenium 之百度搜索,结果列表翻页查询

    selenium之百度搜索,结果列表翻页查询 by:授客 QQ:1033553122 实例:百度搜索,结果列表翻页查询 解决问题:解决selenium driver获取web页面元素时,元素过期问题 ...

  10. 输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m

    题目:编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m.要求将所有的可能组合列出来. 分析:分治的思想.可以把问题(m,n)拆分(m - n, n -1)和(m, n ...