Largest Rectangular Area in a Histogram 最大连续面积
在HankerRank遇到一题计算柱状图连续矩形面积的问题.
举例 hist = [3, 2, 3]. 在这个柱状图里面最大可以容纳一个high = 2 length = 3的连续矩形, 其面积 = 2*3 = 6.
按照提示需要使用stack来是时间复杂度保持在O(n). 搜索提示和代码, 把自己的理解描述如下:
加入数组是升序的 hist = [1, 2, 3]
因为数组是升序的, 所以每一个都会和之后的 high 形成更大的连续面积.
也因为数组是升序的, 所以每一个都会和之前的 high 无法形成更大的连续面积. 3和2无法形成, 因为2和3 已经组合.
所以升序的计算最好是在数组的最后面, i = 3时
i = 3 计算 index = 2的面积. area = 3 * 1; h[index] * (i - (index - 1) - 1)
i = 3 计算 index = 1的面积. area = 2 * 2; h[index] * (i - (index - 1) - 1)
i = 3 计算 index = 0的面积. area = 1 * 3; h[index] * i加入数组是降序的 hist = [3, 2, 1]
和上面分析相反, 但是在i+1均可计算前一个连续矩形面积.
i = 0 不计算
i = 1 计算 index = 0 的面积. area = 3 * 1; h[index] * i
i = 2 计算 index = 1 的面积. area = 2 * 2; h[index] * i
i = 3 计算 index = 2 的面积. area = 1 * 3; h[index] * i
public static long GetLargestArea(int[] h)
{
long maxarea = -1;
long toparea = -1;
int i = 0;
int top;
var stack = new Stack<int>();
while(i < h.Length)
{
if(stack.Count == 0 || h[i] >= h[stack.Peek()])
{
// 把升序的数组索引入栈.
stack.Push(i++);
}
else
{
// 把降序的数组索引出栈.并计算其面积.
top = stack.Pop();
toparea = h[top] * (stack.Count == 0 ? i : (i - stack.Peek() - 1));
if(toparea > maxarea)
maxarea = toparea;
}
}
while(stack.Count != 0)
{
top = stack.Pop();
toparea = h[top] * (stack.Count == 0 ? i : (i - stack.Peek() - 1));
if(toparea > maxarea)
maxarea = toparea;
}
return maxarea;
}
参考:
Largest Rectangular Area in a Histogram
Hackerrank
Largest Rectangular Area in a Histogram 最大连续面积的更多相关文章
- Largest Rectangular Area in a Histogram
题目地址:https://oj.leetcode.com/problems/largest-rectangle-in-histogram/ ,刚開始事实上没做这个题,而是在做https://oj.le ...
- 【Leetcode_easy】812. Largest Triangle Area
problem 812. Largest Triangle Area solution: class Solution { public: double largestTriangleArea(vec ...
- Largest Allowed Area【模拟+二分】
Largest Allowed Area 题目链接(点击) 题目描述 A company is looking for land to build its headquarters. It has a ...
- LeetCode: Largest Rectangle in Histogram(直方图最大面积)
http://blog.csdn.net/abcbc/article/details/8943485 具体的题目描述为: Given n non-negative integers represent ...
- 【LeetCode】84. Largest Rectangle in Histogram——直方图最大面积
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- [Swift]LeetCode812. 最大三角形面积 | Largest Triangle Area
You have a list of points in the plane. Return the area of the largest triangle that can be formed b ...
- [LeetCode] Largest Triangle Area 最大的三角区域
You have a list of points in the plane. Return the area of the largest triangle that can be formed b ...
- LeetCode 812 Largest Triangle Area 解题报告
题目要求 You have a list of points in the plane. Return the area of the largest triangle that can be for ...
- 【LeetCode】812. Largest Triangle Area 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 三重循环 组合函数 日期 题目地址:https:// ...
随机推荐
- Linux常用命令之-删除文件
在测试过程中,有时候会需要删除一些文件,例如日志文件过大等,这里汇总一些删除文件常用的命 已这个系统内的文件为例 删除文件(即这个文件被删除) 单个删除:rm -f + 文件名 eg:rm -f 2 ...
- [elk]验证mapping字段数和数据字段数关系
验证一个mapping下字段缺少或者超过 结论: 没有什么不可以. 1.如果数据字段不在mapping里,则动态会更新mapping. 2.数据字段数也可以小于mapping里字段数 创建一个mapp ...
- Java 数据库程序设计
数据库基础 目前,大多数数据库系统都是关系数据库系统(relational database system).该数据库系统是基于关系数据模型的,这个模型有三个要素:结构.完整性和语言 结构(struc ...
- jenkins centos slave起不来报错The SSH key presented by the remote host does not match the key saved in the Known Hosts file against this host. Connections to this host will be denied until the two keys mat
场景:我的centos-204是一台centos的机器,本来用https://www.cnblogs.com/zndxall/p/8297356.html 的centos slave方式搭建ok的,一 ...
- jq点击事件未生效
jq点击事件未生效,应写成事件委托的方式 // $(function(){ // $('.current a').on("click", function(){ // $(this ...
- Xamarin.Forms 自定义 TapGestureRecognizer 附加属性
While creating Xamarin.Forms applications, definitely you are going to need TapGestureRecognizer oft ...
- Shadow DOM及自定义标签
参考链接:点我 一.什么是Shadow DOM Shadow DOM,直接翻译的话就是 影子 DOM,可以理解为潜藏在 DOM 结构中并且我们无法直接控制操纵的 DOM 结构.类似于下面这种结构 Sh ...
- Django框架详细介绍---请求流程
Django请求流程图 1.客户端发送请求 2.wsgiref是Django封装的套接字,它将客户端发送过来的请求(请求头.请求体封装成request) 1)解析请求数据 2)封装响应数据 3.中间件 ...
- Java IO和Java NIO 和通道 在文件拷贝上的性能差异分析
1. 在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...
- C# 正则表达式提取字符串中括号里的值
version = Regex.Replace(str, @"(.*\()(.*)(\).*)", "$2"); //小括号() Regex rgx = new ...