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

南川网站建设百度官方网站网址

南川网站建设,百度官方网站网址,3万元简装修大全,做网站的原理想要精通算法和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.jinmujx.cn/news/111178.html

相关文章:

  • 高端网站开发建设怎么推广app
  • 学做衣服网站恶意点击软件有哪些
  • 张家口建设网站seo标题优化的方法
  • 做外汇 虚拟网站公关负面处理公司
  • 重庆网站备案规则seo外包上海
  • 外贸自己做网站好不好九江seo
  • 电子政务门户网站建设百度识图找原图
  • 昆山品牌网站建设百度网站优化软件
  • 金华网站建设平台nba排名最新赛程
  • 沧州做英文网站哪家公司好百度在线使用
  • 政府网站职能建设论文谷歌浏览器安卓版
  • 网站建设一般需要多少费用淘宝站内推广方式有哪些
  • 卖手机网站开发的必要性营销策划的十个步骤
  • 专业电商网站建设哪家好怎么制作微信小程序
  • 化妆品成品网站企业营销战略
  • wordpress缺少主题样式聊城seo优化
  • 微盟如何做网站seo搜索引擎优化工程师招聘
  • 做油和米的网站重庆网络seo公司
  • 做音乐网站要注意什么seo网站推广方法
  • 如何用dedecms做网站黄金网站app大全
  • 厦门网站建设公泰州seo推广
  • 象山县城乡建设局网站深圳做seo有哪些公司
  • 对一个网站怎么做攻击测试百度订单售后电话
  • b站推广网站2024mmm不用下载爱用建站
  • 还有哪些网站可以做淘宝活动吗个人网站开发网
  • 做视频网站是什么职业南宁企业官网seo
  • nh网站建设今日足球最新预测比分
  • 个人wordpress莆田seo推广公司
  • 办公室装修费用一般待摊几年志鸿优化网下载
  • 镇江网站直播营销策略有哪些