leetcode第一刷_Largest Rectangle in Histogram
非常难的问题,数组线性时间。
属于我之前说的解法的借助辅助空间。给定两个柱子,他们之间的面积由什么确定呢?没错,他们之间的距离和他们之间最矮的那个柱子的高度。我们并不知道这个柱子在什么位置,所以仅仅能遍历,这个复杂度就上去了。那有没有一个方法避免找中间小柱子呢?先想什么情况下不用找。除非你知道枚举出两个位置之间的柱子都比方今这个长。所以想到了用一个栈来保存较长的那些柱子编号。须要保证的一件事是栈里面的柱子高度一定是递增的,每次计算面积的时候是从当前位置往前计算的,计算一次弹出一次,每次都使用栈顶的高度,就像每次都计算被两个较矮柱子包裹的较高柱子们的面积。
整个算法的过程是这种,一開始栈为空,从左側開始扫,假设栈空,或者当前扫到的位置比栈顶的高度高,直接把编号入栈。为什么入栈的是编号而不是高度呢?由于求的是面积啊,假设仅仅压入面积,每次得到的就少了一维的信息啊亲。假设当前扫到的柱子比栈顶的低怎么办?出栈。注意在出栈时计算面积是不把当前扫到的位置计算在内的,每次都是把栈顶高度当做最低高度,计算从栈顶位置到当前位置前一位置的面积。这个出栈操作到什么时候呢?到栈空或者当前位置的高度最终比栈顶的高了。扫完一遍之后,栈非常可能非空,但里面的柱子肯定是递增的,直接运行一次出栈过程就能够了。
算法为什么是线性的?感觉过程好复杂。不复杂,每一个柱子一定仅仅进栈和出栈一次,想起matrix67对这样的问题的比喻,100天,我每天谈一个美眉,那么我可能失恋200次吗?大神就是大神。
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
int res = 0, tpres, tp;
int msize = height.size();
int i = 0;
stack<int> s;
while(i<msize){
if(s.empty()||height[s.top()]<=height[i]){
s.push(i++);
}else{
tp = s.top();
s.pop();
tpres = height[tp]*(s.empty()?i:i-s.top()-1);
res = max(tpres, res);
}
}
while(!s.empty()){
tp = s.top();
s.pop();
tpres = height[tp]*(s.empty()?i:i-s.top()-1);
res = max(tpres, res);
}
return res;
}
};
leetcode第一刷_Largest Rectangle in Histogram的更多相关文章
- leetcode第一刷_Maximal Rectangle
这个题比刚才那个更难. 假设没做过上一个,这个简直是无情. 先想一个笨笨的解法,如何确定一个矩形呢?找一个左上角,然后每行的看能延伸到什么位置.注意随着行数的添加,列数是仅仅能变短,不能变长. 想一下 ...
- 【LeetCode】84. Largest Rectangle in Histogram 柱状图中最大的矩形(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址: https://leetc ...
- 【LeetCode】84. Largest Rectangle in Histogram
Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...
- 【一天一道LeetCode】#84. Largest Rectangle in Histogram
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given n ...
- 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 ...
- 【LeetCode】084. Largest Rectangle in Histogram
题目: Given n non-negative integers representing the histogram's bar height where the width of each ba ...
- 【LeetCode】84. Largest Rectangle in Histogram——直方图最大面积
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- leetcode@ [84/85] Largest Rectangle in Histogram & Maximal Rectangle
https://leetcode.com/problems/largest-rectangle-in-histogram/ https://leetcode.com/problems/maximal- ...
- leetcode第一刷_Set Matrix Zeroes
这个题乍一看非常easy,实际上还挺有技巧的.我最開始的想法是找一个特殊值标记.遇到一个0,把他所相应的行列中非零的元素标记成这个特殊值.0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0. 问题 ...
随机推荐
- Qt学习之路(49): 通用算法
今天开始的部分是关于Qt提供的一些通用算法.这部分内容来自C++ GUI Programming with Qt 4, 2nd Edition. <QtAlgorithms>提供了一系 ...
- Qt实现不同Treewidget之间拖拽
拖拽是编程中经常要用到的,我这里主要是实习了Treewidget之间直接拖拽Item,按下Ctrl键的话是copy,不按Ctrl则是Move.以下是实现代码 class TreeItemMimeDat ...
- Quartz中文文档使用
Quartz中文使用说明文档,内容相当详细,有需要的码友们可以看看!! 好东西要分享!! 下面是文档的内容目录,附上下载的地址:点击打开链接,下载文档 中文版目录总汇及内容提要 第一章. 企业应用中的 ...
- Oracle成长点点滴滴(3)— 权限管理
上篇我们解说了创建用户以及主要的授权问题.以下我们来解说权限包含对象权限和系统权限. 事实上上节课我们解说就是系统的权限.系统权限就是一些创建表了,表空间等等的系统的权限. 1. 系统权限 ...
- Git现实(四)状态转换
前Git实战(三)环境搭建博文.我们大致解说了一下git的环境安装.今天我们解说一下Git的状态转换. 学习版本号控制工具.对工具进行版本号控制之间的状态转换很重要. 毕竟Git仅仅是一个工具,假设不 ...
- C#_事件
C#_事件 概述 今天用来演示事件的例子是模拟实现一个文件下载类,在这个类中我将定义一个DownLoad事件,这个事件用来在文件下载的过程中,向订阅这个事件的用户发出消息,而这个消息将用DownLoa ...
- WCF技术剖析之十七:消息(Message)详解(中篇)
原文:WCF技术剖析之十七:消息(Message)详解(中篇) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]在上篇中 ...
- 基于visual Studio2013解决面试题之1408桶排序
题目
- 基于visual Studio2013解决面试题之1007鸡蛋和篮子
题目
- android sim 卡短信读写
因为对短信读写操作的api 被隐藏了 , 我们须要使用<Java反射机制的学习>一文中提到的反射的方法得到隐藏API . 这有一个用例大家能够下载http://zhushou.360.cn ...