题目一:柱状图中最大的矩形

力扣题目链接

题目描述:

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积

思路分析:代码随想录

解法一:动归

class Solution {public int largestRectangleArea(int[] heights) {int length = heights.length;int[] minLeftIndex = new int [length];int[] maxRigthIndex = new int [length];// 记录左边第一个小于该柱子的下标minLeftIndex[0] = -1 ;for (int i = 1; i < length; i++) {int t = i - 1;// 这里不是用if,而是不断向右寻找的过程while (t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];minLeftIndex[i] = t;}// 记录每个柱子 右边第一个小于该柱子的下标maxRigthIndex[length - 1] = length;for (int i = length - 2; i >= 0; i--) {int t = i + 1;while(t < length && heights[t] >= heights[i]) t = maxRigthIndex[t];maxRigthIndex[i] = t;}// 求和int result = 0;for (int i = 0; i < length; i++) {int sum = heights[i] * (maxRigthIndex[i] - minLeftIndex[i] - 1);result = Math.max(sum, result);}return result;}
}

解法二:单调栈

class Solution {int largestRectangleArea(int[] heights) {Stack<Integer> st = new Stack<Integer>();// 数组扩容,在头和尾各加入一个元素int [] newHeights = new int[heights.length + 2];newHeights[0] = 0;newHeights[newHeights.length - 1] = 0;for (int index = 0; index < heights.length; index++){newHeights[index + 1] = heights[index];}heights = newHeights;st.push(0);int result = 0;// 第一个元素已经入栈,从下标1开始for (int i = 1; i < heights.length; i++) {// 注意heights[i] 是和heights[st.top()] 比较 ,st.top()是下标if (heights[i] > heights[st.peek()]) {st.push(i);} else if (heights[i] == heights[st.peek()]) {st.pop(); // 这个可以加,可以不加,效果一样,思路不同st.push(i);} else {while (heights[i] < heights[st.peek()]) { // 注意是whileint mid = st.peek();st.pop();int left = st.peek();int right = i;int w = right - left - 1;int h = heights[mid];result = Math.max(result, w * h);}st.push(i);}}return result;}
}

代码随想录训练营day60相关推荐

  1. 【代码随想录训练营】Day43-动态规划

    代码随想录训练营 Day43 今日任务 1049.最后一块石头的重量Ⅱ 494.目标和 474.一和零 语言:Java 1049. 最后一块石头的重量Ⅱ 链接:https://leetcode.cn/ ...

  2. 代码随想录训练营day8

    目录 题目一:反转字符串 解法一:数值交换 解法二:位运算 题目二:反转字符串|| 题目三:替换空格 解法一:双指针 解法二:使用额外空间 题目四:翻转字符串里的单词 解法一: 解法二:纯属娱乐 题目 ...

  3. 【代码随想录训练营】【Day14】第六章|二叉树|理论基础|递归遍历|迭代遍历|统一迭代

    理论基础 二叉树的定义形式有:节点指针和数组 在数组中,父节点的下标为i,那么其左孩子的下标即i*2+1,右孩子的下标即为i*2+2 二叉树的常见遍历形式有:前序遍历.后序遍历.中序遍历和层序遍历 前 ...

  4. 代码随想录训练营day56

    题目一:两个字符串的删除操作 力扣题目链接 题目描述: 给定两个单词 word1 和 word2 ,返回使得 word1 和  word2 相同所需的最小步数. 每步 可以删除任意一个字符串中的一个字 ...

  5. 代码随想录训练营day57

    题目一:回文子串 力扣题目链接 题目描述: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目. 回文字符串 是正着读和倒过来读一样的字符串. 子字符串 是字符串中的由连续字符组成的一 ...

  6. 代码随想录训练营day53

    题目一:最长公共子序列 力扣题目链接 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . 一个字符串的 子序列  ...

  7. 代码随想录训练营day55

    题目一:判断子序列 力扣题目链接 题目描述: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符 ...

  8. 代码随想录训练营day52

    题目一:最长上升子序列 力扣题目链接 题目描述: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度. 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序. ...

  9. 代码随想录训练营day48

    题目一:打家劫舍 力扣题目链接 题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上 ...

最新文章

  1. tableau必知必会之如何在Tableau server中实现工作薄的自动刷新
  2. linux 关于减号 - 代替stdin 和stdout 的用法
  3. LeetCode 1049. 最后一块石头的重量 II
  4. 电脑频繁断网怎么回事_家里网络间歇性断网什么原因 家里网络间歇性断网怎么解决【介绍】...
  5. DB级buffer与IO 查看
  6. 看得懂的设计模式 享元模式python3 最基本(简单)实现
  7. 关于TCP协议的几个问题
  8. 度量分析之报告信息的四个层次:数据,信息,分析,措施
  9. ASP.NET Core 中文文档 第四章 MVC(3.9)视图组件
  10. 《C#高级编程(第六版)》泛型学习笔记(一):泛型优点和特性 (转载)
  11. SDCC讲师专访:创新工场蔡学镛为何看好Dart
  12. MATLAB-数组的使用
  13. Digital Overdose 2021 Autumn CTF 部分题目赛后复现
  14. 13岁我们在做什么,现在20岁我又在做什么
  15. 2017招商银行笔试01
  16. Altium Designer笔记之有效低信号的顶线
  17. SDN 交换机迁移1
  18. 苹果系统安装Java开发环境JDK
  19. 炒菜更香的39个小窍门
  20. .net.3.5sp1_隐藏的宝石-与旧的3.5 SP1帖子不同

热门文章

  1. 任务状态段TSS及TSS描述符、局部描述符表LDT及LDT描述符
  2. 在微信小程序中使用iconfont
  3. 【历史上的今天】2 月 3 日:“开源”一词诞生;比尔·盖茨发表《致电脑爱好者的公开信》;“雾件”问题被提出
  4. 各位效果图设计师,你们真的知道3dmax是什么吗?
  5. C++ LSD直线检测代码示例
  6. java计算机毕业设计国外摇滚乐队交流和周边售卖系统MyBatis+系统+LW文档+源码+调试部署
  7. K-近邻算法(KNN) 预测电影类型
  8. 【Tools】IDApatch工具安装——keypatch
  9. UML各种模板图型汇总大全,教你轻松画!
  10. 南邮 OJ 1208 邮局选址问题