代码随想录算法训练营第47天| 42. 接雨水,84.柱状图中最大的矩形

server/2024/10/19 4:56:41/

第十章 单调栈part02

42. 接雨水

接雨水这道题目是 面试中特别高频的一道题,也是单调栈 应用的题目,大家好好做做。

建议是掌握 双指针 和单调栈,因为在面试中 写出单调栈可能 有点难度,但双指针思路更直接一些。

在时间紧张的情况有,能写出双指针法也是不错的,然后可以和面试官在慢慢讨论如何优化。
https://programmercarl.com/0042.%E6%8E%A5%E9%9B%A8%E6%B0%B4.html

class Solution {public int trap(int[] height) {int length = height.length;if (length <= 2) return 0;int[] maxLeft = new int[length];int[] maxRight = new int[length];// 记录每个柱子左边柱子最大高度maxLeft[0] = height[0];for (int i = 1; i< length; i++) maxLeft[i] = Math.max(height[i], maxLeft[i-1]);// 记录每个柱子右边柱子最大高度maxRight[length - 1] = height[length - 1];for(int i = length - 2; i >= 0; i--) maxRight[i] = Math.max(height[i], maxRight[i+1]);// 求和int sum = 0;for (int i = 0; i < length; i++) {int count = Math.min(maxLeft[i], maxRight[i]) - height[i];if (count > 0) sum += count;}return sum;}
}

84.柱状图中最大的矩形

有了之前单调栈的铺垫,这道题目就不难了。

https://programmercarl.com/0084.%E6%9F%B1%E7%8A%B6%E5%9B%BE%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E7%9F%A9%E5%BD%A2.html

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;}
}

http://www.ppmy.cn/server/132945.html

相关文章

自动化运维的研究与应用

随着信息技术的飞速发展&#xff0c;企业的信息化程度不断提高&#xff0c;IT 系统的规模和复杂性也日益增加。传统的手动运维方式已经无法满足企业对高效、稳定、可靠的 IT 服务的需求。自动化运维作为一种新兴的运维方式&#xff0c;通过引入自动化技术和工具&#xff0c;实现…

四款pdf转图片在线转换免费工具推荐:

大家好&#xff01;今天我来给大家推荐几款PDF转图片的在线转换工具&#xff0c;让你轻松将PDF文件转换成图片&#xff0c;无论是工作还是学习&#xff0c;都能派上大用场。下面&#xff0c;让我们来看看这几款工具吧&#xff01; 一、福昕转换器 直通车&#xff08;粘贴到浏览…

IPv6 DNS简介

IPv6网络中的每台主机都是由IPv6地址来标识的&#xff0c;用户只有获得待访问主机的IPv6地址&#xff0c;才能够成功实现访问操作。对于用户来讲&#xff0c;记住主机的IPv6地址是相当困难的&#xff0c;因此设计了一种字符串形式的主机命名机制&#xff0c;这就是域名系统。用…

PHP权限管理(RBAC)的实现

在PHP中实现基于角色的访问控制&#xff08;RBAC, Role-Based Access Control&#xff09;涉及多个步骤&#xff0c;包括用户管理、角色定义、权限分配以及验证和授权机制。以下是一个简单的实现指南&#xff1a; 1. 数据库设计 首先&#xff0c;你需要设计数据库表来存储用户…

机器学习可解释性

机器学习的稳健性、可解释性和结果正确性等是人工智能安全可信应用必须解决的关键问题。 传统机器学习&#xff1a; 内置可解释性&#xff1a;决策树IF-Then规则&#xff0c;直观可理解事后可解释性&#xff1a;训练结束后的可解释技术特定于模型体系结构的解释与解释方法及模…

Electron+Vue实现两种方式的截屏功能

本次介绍的截屏功能一共有两种分别是在electron环境中与非electron环境中 非electron环境 这个环境下会有一些限制&#xff1a; 1.只能截浏览器中的画面 2.如果里面有iframe或者base64的图片会加载不出来&#xff08;这个会有解决办法&#xff09; yarn add -D js-web-scree…

设计模式:单例模式

单例模式保证一个类只有一个实例&#xff0c;并且提供了全局访问该实例的方法。在单例模式中&#xff0c;通常使用一个静态方法或者一个静态变量来保存实例。该实例被程序的所有模块共享。 具体过程&#xff1a; 1、定义一个单例类 2、私有化构造函数&#xff0c;防止外界直…

如何在Android中存储数据?

在Android中存储数据是开发过程中至关重要的一环&#xff0c;根据数据的类型、大小、访问频率及安全性需求&#xff0c;开发者可以选择多种存储方式。以下是Android中存储数据的几种主要方式&#xff0c;每种方式都有其特定的应用场景和优缺点。 一、SharedPreferences Share…