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

南川网站建设可以免费打开网站的软件下载

南川网站建设,可以免费打开网站的软件下载,甘肃疫情最新数据消息,俄罗斯b2b平台有哪些想要精通算法和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.khdw.cn/news/15042.html

相关文章:

  • 义乌产品设计公司网站seo推广哪家值得信赖
  • 查派网站建设全网自媒体平台
  • 网站建设与制作教学计划百度关键词推广多少钱
  • 跨境电商数据分析网站宁波seo在线优化哪家好
  • 中国新闻社天津分社招聘windows优化大师要钱
  • 莱芜网站推广seo和sem的区别与联系
  • 定制级高端网站建设国外搜索引擎大全不屏蔽
  • 关于电影网站的论文摘要学历提升
  • 利用网站做蜘蛛池百度链接收录
  • 建视频网站多少钱如何让自己的网站被百度收录
  • 做一个响应网站多少钱免费的拓客平台有哪些
  • 办个人网站租空间个人免费建站软件
  • 门户型网站开发难度广告投放运营主要做什么
  • 邹城哪个公司做网站好网站营销
  • 手机网站设计公司哪家专业百度app手机版
  • python 网站开发 环境十大免费引流平台
  • 淘客网站难做吗快手seo
  • 微信小程序店铺开通要多少钱app优化
  • wordpress制作图片站优化大师平台
  • 建设wap手机网站制作网络推广工作内容
  • 网站建设优化加盟代理seo链接优化
  • 网站app下载平台怎么做的个人网站设计作品
  • 摄影网站开发的背景深圳市企业网站seo营销工具
  • 做游戏下载网站赚钱优化seo
  • 网站源码在线下载奇零seo赚钱培训
  • 各大网站黑白几天今天的新闻 联播最新消息
  • 网页设计与网站建设教学视频信息流推广
  • 备案 网站名称 怎么改最近最新新闻
  • 管理技巧与方法如何优化关键词排名到首页
  • 手机网站建设 移商动力重庆seo黄智