单调栈② | Java | LeetCode 接雨水 最大的矩形
42. 接雨水
暴力法
for循环遍历每一个柱子,内层for循环找到左边和右边比它高的柱子
时间复杂度 n^2
优化:添加一个预处理
定义一个数组,存放该柱子右边比他高的柱子是哪一个
再用一个数组,存放该柱子左边比他高的柱子是哪一个
单调栈
单调栈:在每日温度题目中,其要找到右边第一个比他大的温度;适配到本题,就是找到当前柱子左边&右边 第一个比它大的温度
遍历一次就能处理完:当前遍历的元素比栈口元素大的时候,说明栈口柱子右边比它大的那个柱子找到了,它左边比它大的柱子怎么找?在栈中。

class Solution {public int trap(int[] height){int size = height.length;if (size <= 2) return 0;// in the stack, we push the index of array// using height[] to access the real heightStack<Integer> stack = new Stack<Integer>();stack.push(0);int sum = 0;for (int index = 1; index < size; index++){int stackTop = stack.peek();if (height[index] < height[stackTop]){stack.push(index);}else if (height[index] == height[stackTop]){// 因为相等的相邻墙,左边一个是不可能存放雨水的,所以pop左边的index, push当前的indexstack.pop();stack.push(index);}else{//pop up all lower valueint heightAtIdx = height[index];while (!stack.isEmpty() && (heightAtIdx > height[stackTop])){int mid = stack.pop();if (!stack.isEmpty()){int left = stack.peek();int h = Math.min(height[left], height[index]) - height[mid];int w = index - left - 1;int hold = h * w;if (hold > 0) sum += hold; //加不加大于0都一样stackTop = stack.peek();}}stack.push(index);}}return sum;}
}
- 自己再做了一遍
class Solution {public int trap(int[] height) {if(height.length <= 2) {return 0;}Stack<Integer> st = new Stack<>(); //存的是下标st.push(0);int sum = 0;for(int i=1; i<height.length; i++) {// i 下标 height[i]值// height[st.peek()] height[st.pop()]if(height[i] < height[st.peek()]) {st.push(i);} else if(height[i] == height[st.peek()]) {st.pop();st.push(i); //虽然值是一样的,但下标不一样} else { //发现凹槽了// int stackTop = st.peek();int right = i; //凹槽右侧高度while(!st.empty() && height[right] > height[st.peek()]) {int mid = st.pop();//凹点if(!st.empty()) {int left = st.peek();int w = right-left-1;int h = Math.min(height[left], height[right]) - height[mid];int hold = h*w;sum += hold;}}st.push(i);//体积 = w * h }}return sum;}
}
双指针
与单调栈不同的是,双指针求体积求的是 竖向的体积
class Solution {public int trap(int[] height) {int len = height.length;if(len <= 2) return 0;int[]maxLeft = new int[len];int[]maxRight = new int[len];maxLeft[0] = height[0];for(int i=1; i<len; i++) {maxLeft[i] = Math.max(height[i], maxLeft[i-1]);}maxRight[len-1] = height[len-1];for(int i=len-2; i>=0; i--) {// maxLeft[i] = Math.max(height[i], maxLeft[i-1]);maxRight[i] = Math.max(height[i],maxRight[i+1]);}int sum = 0;for(int i=0; i<len; i++) {int h = Math.min(maxLeft[i],maxRight[i]) - height[i];if(h>0) sum+=h; // h*1}return sum;}
}
84.柱状图中最大的矩形
emmm 和接雨水到底哪里一样了???
暴力法 双指针
遍历每一根柱子,向左向右找比它小的边界,算出面积并求最大
优化:两个数组,一个存放i左边比他矮的,一个存放i右边
单调栈
写法不一样了,栈中元素 从栈顶到栈底要 从大到小。
遍历一次就能处理完:当前遍历的元素比栈口元素小的时候,说明栈口柱子右边比它小的那个柱子找到了,它左边比它小的柱子怎么找?在栈中。
- 首尾补0
尾补0:[2,4,6,8]
首补0:[8,6,4,2]
class Solution {public int largestRectangleArea(int[] heights) {int[]newHeight = new int[heights.length+2];for(int i=1; i<=heights.length; i++) {newHeight[i] = heights[i-1];}heights = newHeight; //重定向Stack<Integer> st = new Stack<Integer>();st.push(0);int res=0;for(int i=1; i<heights.length; i++) {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()]) {int mid = st.peek();st.pop();int left = st.peek();int right = i;int w = right - left - 1;int h = heights[mid];res = Math.max(res, w * h);}st.push(i);}}return res;}
}
单调栈最核心的其实是栈顶元素
相关文章:
单调栈② | Java | LeetCode 接雨水 最大的矩形
42. 接雨水 暴力法 for循环遍历每一个柱子,内层for循环找到左边和右边比它高的柱子 时间复杂度 n^2 优化:添加一个预处理 定义一个数组,存放该柱子右边比他高的柱子是哪一个 再用一个数组,存放该柱子左边比他高的柱子是哪一个 …...
2024年全国青少年信息素养大赛总决赛日赛程表
2024全国青少年信息素养大赛赛程表分赛场(浙江传媒学院桐乡校区、桐乡技师学院)日期地点时间赛项16日传媒学院8:00-9:00检录 9:00-10:30开赛图形化编程挑战赛(小学1-3年级)A组12:00-13:00检录 13:00-14:30开赛图形化编程挑战赛&am…...
PHP:连接钉钉接口-钉钉回调事件,本地测试数据
前置数据参考 数据说明:参见官方文档回调事件消息体加解密 - 钉钉开放平台 (dingtalk.com) URL后面带的参数: signature5a65ceeef9aab2d149439f82dc191dd6c5cbe2c0×tamp1445827045067&noncenEXhMP4r Post参数: { &quo…...
【C++标准模版库】vector的介绍及使用
vector 一.vector的介绍二.vector的使用1.vector 构造函数2.vector 空间增长3.vector 增删查改4.vector 迭代器的使用1.正向迭代器2.反向迭代器 5.victor 迭代器失效问题(重点) 三.vector不支持 流提取与流插入四.vector存储自定义类型1.存储string2.存储…...
数说故事|引爆社媒的森贝儿IP,品牌如何实现流量变现?
以可爱、雅痞、贱萌......的外表加魔性舞姿出圈的可爱小狗——森贝儿贵宾犬Milo,用“可爱微怒”的表情演绎着当代打工人的“疯态”,并迅速晋升成不少打工人高频使用的表情包。 最近几年,“萌系”爆款IP频出,用小动物的形象、可爱…...
使用openpyxl库对Excel条件格式的深度探索
哈喽,大家好,我是木头左! openpyxl中的条件格式 在openpyxl中,可以使用ConditionalFormatting类来创建和管理条件格式。这个类有两个主要的方法:add_conditional_formatting()和remove_conditional_formatting(),分别用于添加和删除条件格式。 add_conditional_formatt…...
原生javascript中的ajax通信技术
AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。也就是实现前后端交互的功能。以下是使用AJAX的基本步骤和代码演示: 1.创建一个XMLHttpRequest对象: var xhr…...
SpringBoot Vue用自签名证书SSL配置https,http转发到https(整理文章)
要配置https地址访问,需要向服务器商申请和使用SSL证书。由于是测试阶段,我们自己创建SSL证书,叫作自签名证书。 1.创建自签名证书 Vue前端生成自签名证书我们用openssl 参考文章一 参考文章二SpringBoot后端生成自签名证书用JDK自带的keyt…...
嵌入式人工智能(41-基于树莓派4B的串口蓝牙模块AT09-cc2541)
1、串口蓝牙模块AT-09 AT-09是一种串口蓝牙模块,可实现串口与蓝牙之间的数据传输。AT-09模块基于蓝牙4.0技术,具有低功耗、高传输速率和广泛的应用范围。 AT-09模块支持AT指令,通过串口与外部设备进行通信。用户可以使用AT指令对模块进行配…...
C++ 动态规划
子序列子串相关 单个指一个数组或字符串,两个指两个数组或字符串。 最长上升子序列-单个 dp[i]:以下标i为结尾的递增的最长子序列长度。 位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 1 的最大值。 class Solution { public:int l…...
回溯问题总结
一、子集问题 模板问题 给定一个序列[1,n],求这个序列的所有子集 输入描述: 一个正整数n(1 < n < 12) 输出描述: 每个子集一行,输出所有子集。 输出顺序为: (1)元素个数少的子集优先输出;…...
GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库
使用GraphRAG踩坑无数 在GraphRAG的使用过程中将需要踩的坑都踩了一遍(不得不吐槽下,官方代码有很多遗留问题,他们自己也承认工作重心在算法的优化而不是各种模型和框架的兼容性适配性上),经过了大量的查阅各种资料以…...
.net # 检查 带有pdf xss
1.解决pdf含javasprct脚本动作,这里是验证pdf内部事件。相关pdf文件下载: 测试pdf文件 相关包 iTextSharp 5.5.13.4 iTextSharp using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser;private Boolean IsPdfSafe(Stream stream){// PdfReader…...
【React】探讨className的正确使用方式
文章目录 一、className的正确用法二、常见错误解析三、实例解析四、错误分析与解决五、注意事项六、总结 在React开发中,正确使用className属性对组件进行样式设置至关重要。然而,由于JavaScript和JSX的特殊性,开发者常常会犯一些小错误&…...
打靶记录5——靶机hard_socnet2
靶机: https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova目标: 取得root权限 涉及攻击方法 主机发现端口扫描SQL注入文件上传蚁剑上线XMLRPC命令执行逆向工程动态调试漏洞利用代码编写 方法 CVE-2021-3493缓冲器溢出漏洞 学习目标 …...
独立站+TikTok达人:自主营销与创意内容的完美结合
在全球电商市场迅猛发展的今天,独立站和TikTok达人的结合正在创造一种全新的电商营销模式。独立站作为电商平台,其自主性和灵活性为商家提供了广阔的发展空间;而TikTok达人凭借其独特的内容创作能力和庞大的粉丝基础,成为推动销售…...
【启明智显分享】适用于多功能养生壶、茶吧机的2.8寸触摸彩屏解决方案
健康生活理念不断深入人心,多功能养生壶、茶吧机等智能产品成为现代家庭的热门小家电。为推动智能家居个性化、多样化发展,启明智显推出了基于SC05 Plus 2.8寸触摸彩屏的多功能养生壶、茶吧机的解决方案,旨在提升养生壶与茶吧机的用户体验与操…...
WAF绕过技术(PKAV团队)
目录 主流WAF的绕过技术 Web容器的特性 1. IIS+ASP的神奇% 2. IIS的Unicode编码字符 3. HPP(HTTP Parameter Pollution): HTTP参数污染 4. 畸形HTTP请求 Web应用层的问题 1. 多重编码问题 2. 多数据来源的问题 WAF自身的问题 1. 白名单机制 2. 数据获取方式存在缺陷…...
『 Linux 』POSIX 信号量与基于环形队列的生产者消费者模型
文章目录 信号量概念POSIX 信号量基于环形队列的生产者消费者模型基于环形队列的生产者消费者模型编码实现基于环形队列的生产者消费者模型发送任务测试 信号量概念 信号量是一种用于多线程或多进程间同步的机制; 其定义是一个整形变量,本质上信号量可以看成是一个计数器,用来描…...
python中的字符串方法
python中的字符串 举个例子先 name = 貂蝉开大 #声明了一个字符串 print(name) # 打印了一个字符串 print(name[0:1] #输出貂蝉 print(name[2:3] #输出开大 扩展方法 find() # 查找字符串中某个字符的索引 index_ = name.find("貂") print(index_) # 输出 …...
SQL入门学习笔记
一、一些必备“常识” 数据库是指任何相关信息得集合,可以用不同的方式存储。(如:电话簿,购物清单) 两种主要的数据库类型:关系型数据库(SQL)例如mysql,postgresql(pg)与非关系型数据库(NoSQL)例如mogodb…...
黑苹果终极配置指南:使用Hackintool轻松搞定显卡驱动、音频和USB问题
黑苹果终极配置指南:使用Hackintool轻松搞定显卡驱动、音频和USB问题 【免费下载链接】Hackintool The Swiss army knife of vanilla Hackintoshing 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintool 还在为黑苹果配置头疼吗?显卡驱动不工…...
HarmonyOS6 ArkTS List 跳转准确
文章目录一、功能概述二、官方核心知识点1. 为什么普通 scrollTo 跳转不准?2. childrenMainSize3. ListScroller.scrollTo三、完整可运行代码四、代码核心逻辑解析1. 声明 ChildrenMainSize2. 配置不规则子项高度3. List 绑定 childrenMainSize4. 执行精准滚动跳转总…...
FreeRTOS内存管理实战:如何在Xilinx Zynq上正确配置堆大小避免Malloc失败
FreeRTOS内存管理实战:Xilinx Zynq平台堆配置与优化指南 在嵌入式系统开发中,内存管理往往是决定系统稳定性的关键因素之一。当你在Xilinx Zynq平台上使用FreeRTOS时,突然遇到vApplicationMallocFailedHook()被调用的错误提示,这就…...
告别振动噪音:用DRV8825模块的细分功能,让你的3D打印机或CNC雕刻机运行更安静平稳
静音革命:DRV8825微步进技术在3D打印与CNC中的实战应用 当你的3D打印机在深夜工作时发出刺耳的嗡嗡声,或是CNC雕刻机在低速运行时产生令人不适的振动,这不仅影响工作环境,更会直接反映在成品质量上——那些本应光滑的表面出现的细…...
接地系统安装怎么做才靠谱?从施工流程、质量验收到常见误区
在建筑电气、工业厂房、机电安装、弱电机房、消防系统和防雷系统中,接地系统安装都是绕不开的基础工作。它不像配电柜、桥架、灯具那样“看得见、拍得出”,但它一旦做不好,轻则设备故障、信号干扰、漏电保护误动作,重则引发触电风…...
OpenClaw+Qwen3.5-9B:3步搭建自动化内容审核系统
OpenClawQwen3.5-9B:3步搭建自动化内容审核系统 1. 为什么选择OpenClaw做内容审核? 去年运营一个技术社区时,我每天要花2小时手动审核用户提交的内容。直到发现OpenClaw这个开源自动化框架,配合Qwen3.5-9B的多模态能力ÿ…...
开源AI工具降本增效:Pixel Fashion Atelier助力小型工作室节省70%概念图外包成本
开源AI工具降本增效:Pixel Fashion Atelier助力小型工作室节省70%概念图外包成本 1. 项目概述 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的开源图像生成工具,专为时尚设计领域打造。它通过创新的像素风格界面和优化的模型组合&am…...
淘宝任务自动化:让每天25分钟的重复操作变成5分钟的智能管理
淘宝任务自动化:让每天25分钟的重复操作变成5分钟的智能管理 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi …...
DAMOYOLO-S保姆级教学:Gradio自定义组件添加‘清空缓存’按钮实操
DAMOYOLO-S保姆级教学:Gradio自定义组件添加‘清空缓存’按钮实操 1. 引言:为什么需要“清空缓存”按钮? 如果你用过DAMOYOLO-S这个目标检测模型,可能会发现一个不大不小的问题:连续上传多张图片进行检测后ÿ…...
