leetcode-单调栈26

关于单调栈的顺序总结: 

寻找右边第一个比我大的:从左到右遍历,栈单调递减
寻找左边第一个比我小的:从左到右遍历,栈单调递增
寻找右边第一个比我小的:从右到左遍历,栈单调递增
寻找左边第一个比我大的:从右到左遍历,栈单调递减

找哪边的就从哪边遍历(需要优先处理边界),找小的就单调递增(栈底小栈顶大);找大的就单调递减(栈底大栈顶小)。汉诺塔

遇到相同的元素,更新栈内下标,就是将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中。

例如 5 5 1 3 这种情况。如果添加第二个5的时候就应该将第一个5的下标弹出,把第二个5添加到栈中。





leetcode-739-每日温度

单调栈:当要入栈元素大于栈顶元素时,更新栈顶元素中res的值,并将栈顶元素移除

               当要入栈元素小于栈顶元素时,直接入栈

判别是否需要使用单调栈,如果需要找到左边或者右边第一个比当前位置的数大或者小,则可以考虑使用单调栈

模拟过程:

当i = 0时,单调栈为空,将0进栈

        stack = { 0(73) }

        ans = {0,0,0,0,0,0,0,0}

当i = 1时,由于74大于73,因此移除栈顶元素0,赋值ans[0] = 1-0,将1入栈

        stack = { 1(74) }

        ans = {1,0,0,0,0,0,0,0}

当i = 2时,由于75大于74,因此移除栈顶元素1,赋值ans[1] = 2-1,将2入栈

        stack = { 2(75) }

        ans = {1,1,0,0,0,0,0,0}

当i = 3时,由于71小于75,将3入栈

        stack = { 2(75),3(71) }

        ans = {1,1,0,0,0,0,0,0}

当i = 4时,由于69小于71,将4入栈

        stack = { 2(75),3(71) ,4(69)}

        ans = {1,1,0,0,0,0,0,0}

当i = 5时,由于72大于69和71,因此依次移除栈顶元素4和3,赋值ans[4] = 5-4 和 ans[3] = 5-3,将5入栈

        stack = { 2(75) ,5(72)}

        ans = {1,1,0,2,1,0,0,0}

当i = 6时,由于76大于72和75,因此依次移除栈顶元素5和2,赋值ans[5] = 6-5 和 ans[2] = 6-2,将6入栈

        stack = { 6(76) }

        ans = {1,1,0,2,1,1,0,0}

当i = 7时,由于73小于76,将7入栈

        stack = {6(76),7(73)}

        ans = {1,1,4,2,1,1,0,0}

typedef struct stkNode{int val;int index;
}stkNode;stkNode* getNode(int val, int i){stkNode* node = (stkNode*)malloc(sizeof(stkNode));node->val = val;node->index = i;return node;
}int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize) {stkNode** stk = (stkNode**)malloc(sizeof(stkNode*)*temperaturesSize);int stk_top = 0;int* res = (int*)malloc(sizeof(int)*temperaturesSize);memset(res,0,sizeof(int)*temperaturesSize);for(int i = 0 ; i < temperaturesSize ; i++){stkNode* node = getNode(temperatures[i],i);while(stk_top > 0 && temperatures[i] > stk[stk_top-1]->val){stk_top--;int k = stk[stk_top]->index;res[k] = i-k;}stk[stk_top++] = node;}*returnSize = temperaturesSize;return res;
}

leetcode-496-下一个更大元素I

typedef struct stkNode {int val;int index;
}stkNode;stkNode* getNode(int val, int index) {stkNode* node = (stkNode*)malloc(sizeof(stkNode));node->val = val;node->index = index;return node;
}int* nextGreaterElement(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {stkNode* stk[1000];int stk_top = 0;int next[nums2Size];for(int i = 0 ; i < nums2Size ; i++){next[i] = 0;}for (int i = 0; i < nums2Size; i++) {stkNode* node = getNode(nums2[i], i);while (stk_top > 0 && nums2[i] > stk[stk_top - 1]->val) {stk_top--;int k = stk[stk_top]->index;next[k] = nums2[i];}stk[stk_top++] = node;}int* res = (int*)malloc(sizeof(int)*nums1Size);*returnSize = nums1Size;for(int i = 0 ; i < nums1Size ; i++){res[i] = 0;}for (int i = 0; i < nums1Size; i++) {for (int j = 0; j < nums2Size; j++) {if (nums1[i] == nums2[j]) {res[i] = next[j];}}if (res[i] == 0) {res[i] = -1;}}return res;
}

leetcode-503-下一个更大元素II

将循环数组拉直,前n-1个元素复制到数组末尾

int* nextGreaterElements(int* nums, int numsSize, int* returnSize) {*returnSize = numsSize;if(numsSize == 0)return NULL;int* res = (int*)malloc(sizeof(int)*numsSize);memset(res,-1,sizeof(int)*numsSize);int stk[2*numsSize-1];int stk_top = 0;for(int i = 0 ; i < 2*numsSize-1 ; i++){while(stk_top > 0 && nums[i%numsSize] > nums[stk[stk_top-1]]){stk_top--;res[stk[stk_top]] = nums[i%numsSize];}stk[stk_top++] = i%numsSize;}return res;
}

leetcode-42-接雨水

1.双指针

列4 左侧最高的柱子是列3,高度为2。

列4 右侧最高的柱子是列7,高度为3。

列4 柱子的高度为1(以下用height表示)

那么列4的雨水高度为 列3和列7的高度最小值减列4高度,即: min(lHeight, rHeight) - height。列4的雨水高度求出来了,宽度为1,相乘就是列4的雨水体积了。

一样的方法,只要从头遍历一遍所有的列,然后求出每一列雨水的体积,相加之后就是总雨水的体积了。

首先从头遍历所有的列,并且要注意第一个柱子和最后一个柱子不接雨水

当前列雨水面积:min(左边柱子的最高高度,记录右边柱子的最高高度) - 当前柱子高度。

为了得到两边的最高高度,使用了双指针来遍历

当前位置,左边的最高高度是前一个位置的左边最高高度和本高度的最大值。

即从左向右遍历:maxLeft[i] = max(height[i], maxLeft[i - 1]);

从右向左遍历:maxRight[i] = max(height[i], maxRight[i + 1]);

int trap(int* height, int heightSize) {int maxLeft[heightSize];int maxRight[heightSize];maxLeft[0] = height[0];maxRight[heightSize-1] = height[heightSize-1];for(int i = 1 ; i < heightSize ; i++){maxLeft[i] = fmax(height[i],maxLeft[i-1]);}for(int i = heightSize-2 ; i >= 0 ; i--){maxRight[i] = fmax(height[i],maxRight[i+1]);}int area = 0;for(int i = 1 ; i < heightSize-1 ; i++){int high = fmin(maxLeft[i],maxRight[i])-height[i];area += high;}return area;
}

单调栈

int trap(int* height, int heightSize) {if(heightSize == 0)return 0;int ans = 0;int stk[heightSize];int top = 0;for(int i = 0 ; i < heightSize ; i++){while(top && height[i] > height[stk[top-1]]){int stk_top = stk[--top];if(!top){break;}int left = stk[top-1];int curWidth = i-left-1;int curHeight = fmin(height[left],height[i]) - height[stk_top];ans += curWidth*curHeight;}stk[top++] = i;}return ans;
}

leetcode-84-柱状图中最大的矩形

首先我们枚举某一根柱子 i 作为高 h=heights[i];

随后我们需要进行向左右两边扩展,使得扩展到的柱子的高度均不小于 h。换句话说,我们需要找到左右两侧最近的高度小于 h 的柱子,这样这两根柱子之间(不包括其本身)的所有柱子高度均不小于 h,并且就是 i 能够扩展到的最远范围。 

利用哨兵下标

int largestRectangleArea(int* heights, int heightsSize) {int* leftMin = (int*)malloc(sizeof(int)*(heightsSize+1));int* rightMin = (int*)malloc(sizeof(int)*(heightsSize+1));for(int i = 0 ; i <= heightsSize ; i++){leftMin[i] = -1;rightMin[i] = heightsSize;}int stk[heightsSize];int stk_top = 0;for(int i = 0 ; i < heightsSize ; i++){while(stk_top > 0 && heights[i] < heights[stk[stk_top-1]]){stk_top--;rightMin[stk[stk_top]] = i;}stk[stk_top++] = i;}memset(stk,0,sizeof(int)*heightsSize);stk_top = 0;for(int i = heightsSize-1 ; i >= 0 ; i--){while(stk_top > 0 && heights[i] < heights[stk[stk_top-1]]){stk_top--;leftMin[stk[stk_top]] = i;}stk[stk_top++] = i;}int ans = 0;for(int i = 0 ; i < heightsSize ; i++){ans = fmax(ans,(rightMin[i]-leftMin[i]-1)*heights[i]);}return ans;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:安装 CentOS 7(完整教程)

文章目录 一、简介二、安装 CentOS 72.1 虚拟机配置2.2 安装CentOS 7 三、连接远程服务器&#xff08;扩展&#xff09;3.1 获取虚拟机 IP 地址3.2 连接远程服务器 四、结语 一、简介 CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个基于 Linux 的…

Nautilus 正式发布:为 Sui 带来可验证的链下隐私计算

作为 Sui 安全工具包中的强大新成员&#xff0c;Nautilus 现已上线 Sui 测试网。它专为 Web3 开发者打造&#xff0c;支持保密且可验证的链下计算。Nautilus 应用运行于开发者自主管理的可信执行环境&#xff08;Trusted Execution Environment&#xff0c;TEE&#xff09;中&a…

Git完全指南:从入门到精通版本控制 ------- Git 工作流程 (3)

Git工作流程完全指南&#xff1a;从入门到高效协作 引言 Git作为分布式版本控制系统的行业标准&#xff0c;其高效的分支管理能力是团队协作的基石。本文将深入解析标准Git工作流程&#xff0c;助你掌握从代码提交到团队协作的全链路实践。 一、Git核心概念速览 三大工作区域 …

Distortion, Animation Raymarching

这节课的主要目的是对uv进行操作&#xff0c;实现一些动画的效果&#xff0c;实际就是采样的动画 struct texDistort {float2 texScale(float2 uv, float2 scale){float2 texScale (uv - 0.5) * scale 0.5;return texScale;}float2 texRotate(float2 uv, float angle){float…

《vue3学习手记3》

标签的ref属性 vue3和vue2中的ref属性&#xff1a; 用在普通DOM标签上&#xff0c;获取的是DOM节点 ref用在组件标签上&#xff0c;获取的是组件实例对象 区别在于&#xff1a; 1.vue3中person子组件中的数据父组件App不能直接使用&#xff0c;需要引入并使用defineExpose才可…

List基础与难度题

1. 向 ArrayList 中添加元素并打印 功能描述&#xff1a; 程序创建一个空的 ArrayList 集合&#xff0c;用于存储字符串类型的元素。向该 ArrayList 中依次添加指定的字符串元素。使用增强型 for 循环遍历 ArrayList 中的所有元素&#xff0c;并将每个元素打印输出到控制台。 …

楼宇自控系统如何为现代建筑打造安全、舒适、节能方案

在科技飞速发展的当下&#xff0c;现代建筑对功能和品质的要求日益提升。楼宇自控系统作为建筑智能化的核心技术&#xff0c;宛如一位智慧的“管家”&#xff0c;凭借先进的技术手段&#xff0c;为现代建筑精心打造安全、舒适、节能的全方位解决方案&#xff0c;让建筑真正成为…

绿算轻舟系列FPGA加速卡:驱动数字化转型的核心动力【2】

工业与医疗&#xff1a;精准化的幕后推手 在工业4.0与智慧医疗领域&#xff0c;绿算轻舟FPGA加速卡通过实时信号处理与高精度控制&#xff0c;推动关键场景的技术升级。 工业自动化&#xff1a;在机器视觉质检中&#xff0c;实现亚像素级缺陷检测&#xff0c;产线检测速度大幅…

uniapp-商城-22-顶部模块

这里其实很复杂.我们在前面已经说了这个组件 shop-headbar ,这里来继续说。 该组件实现一个高度的显示以及图片展示,包含logo 名称 后台管理以及避让 导航栏 和 手机的状态栏。 1 整体 代码如下: <template><view class="headr" :style="{ hei…

利用Global.asax在ASP.NET Web应用中实现功能

Global.asax文件&#xff08;也称为ASP.NET应用程序文件&#xff09;是ASP.NET Web应用程序中的一个重要文件&#xff0c;它允许您处理应用程序级别和会话级别的事件。下面介绍如何利用Global.asax来实现各种功能。 Global.asax基本结构 <% Application Language"C#&…

ReportLab 导出 PDF(页面布局)

ReportLab 导出 PDF&#xff08;文档创建&#xff09; ReportLab 导出 PDF&#xff08;页面布局&#xff09; ReportLab 导出 PDF&#xff08;图文表格) PLATYPUS - 页面布局和排版 1. 设计目标2. 开始3. Flowables3.1. Flowable.draw()3.2. Flowable.drawOn(canvas,x,y)3.3. F…

Ubuntu下安装Intel MKL完整指南

&#x1f9e0; Intel MKL 安装指南&#xff08;Ubuntu 完整版&#xff09; 适用平台&#xff1a;Ubuntu 18.04 / 20.04 / 22.04 更新时间&#xff1a;2025 年最新版&#xff08;适配 Intel oneAPI 2024&#xff09; ✅ 一、安装方式选择 安装方式适合用户群体特点推荐程度&…

HackMyVM Gigachad.

Gigachad 信息搜集 ┌──(root㉿kali)-[/home/kali] └─# nmap 192.168.214.85 Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-16 07:42 EDT Nmap scan report for 192.168.214.85 Host is up (0.00011s latency). Not shown: 997 closed tcp ports (reset) PORT S…

大模型全景解析:从技术突破到行业变革

目录 一、引言&#xff1a;人工智能的新纪元 二、大模型发展历史与技术演进 1. 早期探索期&#xff08;2015-2017&#xff09;&#xff1a;从"人工智障"到初具规模 RNN/LSTM架构时代&#xff08;2013-2017&#xff09; Transformer革命&#xff08;2017&#xf…

49、Spring Boot 详细讲义(六)(SpringBoot2.x整合Mybatis实现CURD操作和分页查询详细项目文档)

项目文档:银行借据信息CURD操作和分页查询 一、项目概述 1. 项目简介 本项目旨在使用Spring Boot框架整合MyBatis连接Mysql数据库实现借据信息的增加、删除、修改和查询功能,同时支持分页查询,并提供对应的Restful风格的接口。 2.环境准备 2.1.工具和软件准备 JDK(建议…

youtube视频和telegram视频加载原理差异分析

1. 客户侧缓存与流式播放机制​​ 流式视频应用&#xff08;如 Netflix、YouTube&#xff09;通过​​边下载边播放​​实现流畅体验&#xff0c;其核心依赖以下技术&#xff1a; ​​缓存预加载​​&#xff1a;客户端在后台持续下载视频片段&#xff08;如 DASH/HLS 协议的…

把城市变成智能生命体,智慧城市的神奇进化

智能交通系统的建立与优化 智能交通系统&#xff08;ITS&#xff09;是智慧城市建设的核心部分之一&#xff0c;旨在提升交通管理效率和安全性。该系统利用传感器网络、GPS定位技术以及实时数据分析来监控和管理城市中的所有交通流动。例如&#xff0c;通过部署于道路两侧或交…

Oracle 23ai Vector Search 系列之5 向量索引(Vector Indexes)

文章目录 Oracle 23ai Vector Search 系列之5 向量索引Oracle 23ai支持的向量索引类型内存中的邻居图向量索引 (In-Memory Neighbor Graph Vector Index)磁盘上的邻居分区矢量索引 (Neighbor Partition Vector Index) 创建向量索引HNSW索引IVF索引 向量索引示例参考 Windows 环…

cas 5.3单点登录中心开发手册

文档格式PDF 只读文档。 代码源码。 一、适用对象 需要快速上手出成果的服务端开发人员&#xff0c;具备3年经验java 开发&#xff0c;熟悉数据库&#xff0c;基本的Linux操作系统配置。 工期紧张需要快速搭建以cas为基础的统一登录中心&#xff0c;遇到技术瓶颈&#xff0c…

行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (第一部分)

行星际激波在日球层中的传播&#xff1a;Propagation of Interplanetary Shocks in the Heliosphere &#xff08;第二部分&#xff09;- Chapter 3: Solar and heliospheric physics 行星际激波在日球层中的传播&#xff1a;Propagation of Interplanetary Shocks in the Hel…