在HankerRank遇到一题计算柱状图连续矩形面积的问题.

举例 hist = [3, 2, 3]. 在这个柱状图里面最大可以容纳一个high = 2 length = 3的连续矩形, 其面积 = 2*3 = 6.



按照提示需要使用stack来是时间复杂度保持在O(n). 搜索提示和代码, 把自己的理解描述如下:

  1. 加入数组是升序的 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

  2. 加入数组是降序的 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 最大连续面积的更多相关文章

  1. Largest Rectangular Area in a Histogram

    题目地址:https://oj.leetcode.com/problems/largest-rectangle-in-histogram/ ,刚開始事实上没做这个题,而是在做https://oj.le ...

  2. 【Leetcode_easy】812. Largest Triangle Area

    problem 812. Largest Triangle Area solution: class Solution { public: double largestTriangleArea(vec ...

  3. Largest Allowed Area【模拟+二分】

    Largest Allowed Area 题目链接(点击) 题目描述 A company is looking for land to build its headquarters. It has a ...

  4. LeetCode: Largest Rectangle in Histogram(直方图最大面积)

    http://blog.csdn.net/abcbc/article/details/8943485 具体的题目描述为: Given n non-negative integers represent ...

  5. 【LeetCode】84. Largest Rectangle in Histogram——直方图最大面积

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

  6. [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 ...

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

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

  9. 【LeetCode】812. Largest Triangle Area 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 三重循环 组合函数 日期 题目地址:https:// ...

随机推荐

  1. sqlplus用户登录

    1.运行SQLPLUS工具 C:\Users\wd-pc>sqlplus 2.直接进入SQLPLUS命令提示符 C:\Users\wd-pc>sqlplus /nolog 3.以OS身份连 ...

  2. Java 基础 多线程进阶(锁,线程安全)

    一,前言 前面我们已经对线程和线程池有一定的了解,但是只要说到多线程,肯定需要考虑线程安全等问题.接下来我们就来好好聊聊这些问题. 二,线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段 ...

  3. REDHAT YUM本地源的搭建和使用

    yum源一般分为两种,本地yum源和本地网络yum源,前者是通过文件提供安装包,后者是通过网络下载安装包: 由于Redhat7.3的yum源需要注册付费,所以往往会出现下载yum源安装包失败,如下图: ...

  4. 深入了解webpack前,可以了解的小知识点。

    阅读前:文章大概是写,简单用过webpack,想继续深入了解webpack前需要了解的知识.但文章内容跟webpack使用关系并不大. 文章概要: Object.defineProperty call ...

  5. java的冒泡排序

    public interface Sorter{ public <T extends Comparable<T>> void sort(T[] list); //定义两个待排序 ...

  6. 打包工具webpack安装·Mac

    最近在学Vue.js,是我接触的第一个前端框架.本来感觉还不错,各种惊叹于它可以用很少的代码写出那种具备交互能力的神奇模块. 在学的过程中总是能碰到一个叫webpack的单词,查过,是一个模块打包器, ...

  7. xpath详细讲解

    什么是XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 的标签需要 ...

  8. CentOS 7 zabbix实现微信报警

    环境 : LAMP  CentOS7  192.168.94.11 首先搭建LAMP环境 , 安装zabbix [root@zabbix-server ~]# wget http://repo.zab ...

  9. 2018-2019-3 网络对抗技术 20165305 Exp3 免杀原理与实践

    1.实验内容及步骤 1.1 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,加壳工具,使用shellcode编程 将做实验二时生成的后门文件用virusto ...

  10. mysql数据类型优化

    选择优化的数据类型原则: 1. 更小的通常更好 尽量使用可以正确存储数据的最小数据类型.更小的数据类型通常更快,因为它们占用更少的磁盘.内存和CPU缓存,并且处理时需要的CPU周期也更少. 2. 简单 ...