在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

最新文章

  1. C# MD5摘要算法、哈希算法
  2. 亲手使用Sencha Touch + phonepag开发Web APP随笔 -- 环境安装篇
  3. php 使用curl模拟登录人人(校内)网
  4. ORACLE 空表不能导出问题解决
  5. oracle java SE
  6. Maven异常:Could not find artifact
  7. Ajax2
  8. java面向对象编程——第六章 数组
  9. xml和html之间相互转换
  10. (转)使用DataTime这个类来获取当前的时间
  11. 查看MDB格式文件数据表
  12. C#指定目录存放DLL
  13. UE4上传图片到服务器
  14. windows系统下用python更新svn和Git
  15. 利用Openssh后门 劫持root密码
  16. Scala隐式转换
  17. JavaScript——JS屏蔽F12和右键
  18. Jsp俩大内置对象学习
  19. Elasticsearch5.5.1学习笔记
  20. POJ 2513 - Colored Sticks - [欧拉路][图的连通性][字典树]

热门文章

  1. centos禁ping
  2. JSTL将number类型转化为String类型
  3. 如何成功安装旧版本火狐,成功安装firebug和firepath插件
  4. selenium 对浏览器标签页进行关闭和切换
  5. 来吧学学.Net Core之项目文件简介及配置文件与IOC的使用
  6. Docker:从头开始基于CentOS-Minimal安装Docker
  7. python数组
  8. href和src的区别(小计)
  9. PeopleSoft translate value 排序
  10. JAVA String中文乱码