当前位置: 首页 > news >正文

南川网站建设百度pc端提升排名

南川网站建设,百度pc端提升排名,企业微信登录,济南科技网站建设想要精通算法和SQL的成长之路 - 柱状图中最大的矩形前言一. 柱状图中最大的矩形前言 想要精通算法和SQL的成长之路 - 系列导航 一. 柱状图中最大的矩形 原题链接 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求…

想要精通算法和SQL的成长之路 - 柱状图中最大的矩形

  • 前言
  • 一. 柱状图中最大的矩形

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 柱状图中最大的矩形

原题链接

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。

在这里插入图片描述
这道题目我们可以仿照着接雨水这道题目来做。

思路:

  1. 我们可以遍历所有的柱子,在每次遍历的时候,我们以当前柱子作为一个中心点。
  2. 我们分别向左、向右各自寻找第一个小于当前高度的柱子,找到他们的索引分别是leftright
  3. 那么以当前柱子为固定高度的最大面积就是 :(right-left-1)* curHeight

那么我们来看下题目给的案例,按按照这个思想来做是否可行呢?当我们以第一根柱子作为中心,向两侧寻找第一个最低点的时候,就出问题啦:
在这里插入图片描述
那好,我们对此情况,我们稍微改造改造,我们给数组两侧添加两个虚拟节点,高度是0,如图:
在这里插入图片描述
那么这样的话,left=0,cur=1,right=2。以高度为2去寻找最大面积的话,就是2*(2-0-1)=2了。

我们再来看下以柱子高度5的为中心:
在这里插入图片描述

我们在试想一下,既然我们要以每个遍历的节点为中心,并寻找到左右两侧第一个比他小的元素。那么我们就可以使用单调递增栈来完成。

前期准备部分,我们先给数组添加两个虚拟节点

int[] tmpHeight = new int[heights.length + 2];
for (int i = 1; i <= heights.length; i++) {tmpHeight[i] = heights[i - 1];
}

然后我们再看看递归过程:

  • 既然我们需要单调递增,那么遇到小的,就应该把当前栈内比当前高度高的,给剔除(同时计算高度)。也就保证了循环:while (!stack.isEmpty()&&tmpHeight[stack.peek()]>tmpHeight[right])因为无论怎么样,我们必须要把当前元素给放到栈中的。不能不放。
  • 既然是单调递增栈,那么栈顶元素和栈中的第二个元素就是我们要的中心元素、左侧第一个比栈顶元素小的。而当前元素就是右侧第一个比栈顶元素小的。看图能更直观点(红框部分),这时候遍历的时候,栈中元素有0和2,当遇到1的时候,满足while条件。
    在这里插入图片描述
for (int right = 0; right < tmpHeight.length; right++) {// 一旦遇到某个节点比当前节点小了,就可以计算面积了。while (!stack.isEmpty() && tmpHeight[stack.peek()] > tmpHeight[right]) {// 栈顶元素(也就是我们说的中心柱子)int current = stack.pop();// left是左侧第一个比中心柱子矮的,right就是右侧第一个比中心柱子高的,// 因为在tmpHeight[stack.peek()] > tmpHeight[right]的前提约束下Integer left = stack.peek();// 计算面积res = Math.max(res, (right - left - 1) * tmpHeight[current]);}stack.push(right);
}

最终代码如下:

public int largestRectangleArea(int[] heights) {int res = 0;// 单调栈递增LinkedList<Integer> stack = new LinkedList<>();// 增加两个虚拟节点的临时数组int[] tmpHeight = new int[heights.length + 2];for (int i = 1; i <= heights.length; i++) {tmpHeight[i] = heights[i - 1];}for (int right = 0; right < tmpHeight.length; right++) {// 一旦遇到某个节点比当前节点小了,就可以计算面积了。while (!stack.isEmpty() && tmpHeight[stack.peek()] > tmpHeight[right]) {// 栈顶元素(也就是我们说的中心柱子)int current = stack.pop();// left是左侧第一个比中心柱子矮的,right就是右侧第一个比中心柱子高的,// 因为在tmpHeight[stack.peek()] > tmpHeight[right]的前提约束下Integer left = stack.peek();// 计算面积res = Math.max(res, (right - left - 1) * tmpHeight[current]);}stack.push(right);}return res;
}
http://www.dt0577.cn/news/33101.html

相关文章:

  • 学校网站手机站的建设方案有域名有服务器怎么做网站
  • 做网站怎么建立文件夹深圳网络推广seo软件
  • 课程设计代做网站php百度网站打不开
  • 技术支持 祥云平台 英文网站广告推广平台网站
  • 教你如何做网站今天最新的新闻头条新闻
  • 那些网站可以做兼职西安网站设计公司
  • 做网站运营工资是不是很低网上营销网站
  • 莱芜网站推广珠海百度seo
  • 做的比较唯美的网站有哪些竞价网官网
  • 购买淘宝店铺在哪个平台seo基础知识考试
  • 汉口网站建设 优帮云ping站长工具
  • 顺德网站建设公司信息东莞网络推广公司
  • 如何再网站上做免费广告词免费做网站怎么做网站链接
  • 秦皇岛专业做网站企业邮箱账号
  • 建设一个网站需要条件电子商务主要学什么
  • 南城网站建设公司方案百度搜索引擎入口
  • 但是打不开网页网站排名seo培训
  • aspnet东莞网站建设多少钱推广什么app佣金高
  • 网上有做口译的网站么怎么推广自己的产品
  • 平面设计素材网站推荐百度怎么免费推广
  • 黄岛因特网站建设公司北京突发重大消息
  • 电子科技公司网站网课培训机构排名前十
  • 深圳专业做网站服务怎么做网页
  • 清溪做网站北京百度推广开户
  • 大大大大大大大dj搜索引擎优化的基础是什么
  • 北京低价做网站登录百度
  • 做网站用小型机或服务器seo优化工具
  • 陕西住房与城乡建设部网站伊春seo
  • 宁波建网站需要什么郑州网站优化公司
  • 长治网络推广公司seo查询seo优化