单调栈(C) 📅 发布时间:2026/7/7 11:39:37 👁️ 浏览次数: 目录思路model例题例题739 - 每日温度 mid例题496 - 下一个更大元素Ⅰeasy例题503 - 下一个更大元素Ⅱ mid例题42 - 接雨水 hard例题84 - 柱状图中最大矩阵 hard学习代码随想录题源LeetCode思路某元素左边或右边第一个比当前元素大或小的元素单调栈的栈内元素保持单调递增或递减的顺序按照从栈顶-栈底model// ans记录结果int* ans;// 单调栈初始化int* stk;int top 0;stk[0] nums[0[;// 一次遍历 --- 下标压栈for(int i 1; inumsSize; i){while(top0 nums[i]nums[stk[top]]){// 处理ans[stk[top]] nums[i];top--;}stk[top] i;}// return*returnSize numsSize;return ans;例题例题739 - 每日温度mid给定一个整数数组temperatures表示每天的温度返回一个数组answer其中answer[i]是指对于第i天下一个更高温度出现在几天后。如果气温在这之后都不会升高请在该位置用0来代替。单增栈找下一个更高温度--元素压栈遇到比栈顶大的出栈然后当前元素压栈几天后--栈中存放下标ans中记录当前下标-出栈下标/** * Note: The returned array must be malloced, assume caller calls free(). */ int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize) { // init stk int* ans calloc(temperaturesSize, sizeof(int)); int* stk calloc(temperaturesSize, sizeof(int)); int top -1; // 采用实心也就是top指向有数据的 stk[top] 0; for(int i 1; itemperaturesSize; i){ while(top0 temperatures[i]temperatures[stk[top]]){ // 当栈非空且当前元素的值大于栈顶元素 int idx stk[top]; // 出栈下标ans要记录的下标 ans[idx] i-idx; // ans记录 top--; // 出栈 } stk[top] i; // 新元素入栈 } *returnSize temperaturesSize; return ans; }例题496 - 下一个更大元素Ⅰeasynums1中数字x的下一个更大元素是指x在nums2中对应位置右侧的第一个比x大的元素。给你两个没有重复元素的数组nums1和nums2下标从0开始计数其中nums1是nums2的子集。对于每个0 i nums1.length找出满足nums1[i] nums2[j]的下标j并且在nums2确定nums2[j]的下一个更大元素。如果不存在下一个更大元素那么本次查询的答案是-1。返回一个长度为nums1.length的数组ans作为答案满足ans[i]是如上所述的下一个更大元素。单增栈hash表和单调栈结合思路一① hash元素初始化-1记录nums1元素对应下标或初始化0下标1防止下标0的情况② 对nums2遍历使用单增栈得到各元素对应下一个最大元素③ 然后判断是否在hash即nums1里面加入ans思路二① hash元素初始化-1② 对nums2遍历使用单增栈得到各元素对应下一个最大元素记录在hash表中③ 遍历nums1元素对应hash表中值即下一个最大元素加入ans// way1 int* nextGreaterElement(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) { int* hash calloc(10001, sizeof(int)); for(int i 0; inums1Size; i){ hash[nums1[i]] i1; // 初始化hash为-1不用加该1 } int* ans malloc(nums1Size*sizeof(int)); memset(ans, -1, nums1Size*sizeof(int)); int* stk calloc(nums2Size, sizeof(int)); int top 0; stk[0] 0; for(int i 1; inums2Size; i){ while(top0 nums2[i]nums2[stk[top]]){ int x hash[nums2[stk[top]]]; if(x){ ans[x-1] nums2[i]; // 初始化hash为-1不用减该1 } top--; } stk[top] i; // 下标压栈 } *returnSize nums1Size; return ans; } // way2 int* nextGreaterElement(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) { int hash[10001]; memset(hash, -1, sizeof(hash)); int* ans malloc(sizeof(int)*nums1Size); int* stk calloc(nums2Size, sizeof(int)); int top 0; stk[0] nums2[0]; for(int i 1; inums2Size; i){ while(top0 nums2[i]stk[top]){ hash[stk[top]] nums2[i]; top--; } stk[top] nums2[i]; // 元素压栈 } for(int i 0; inums1Size; i){ ans[i] hash[nums1[i]]; } *returnSize nums1Size; return ans; }例题503 - 下一个更大元素Ⅱmid给定一个循环数组numsnums[nums.length - 1]的下一个元素是nums[0]返回nums中每个元素的下一个更大元素。数字x的下一个更大的元素是按数组遍历顺序这个数字之后的第一个比它更大的数这意味着你应该循环地搜索它的下一个更大的数。如果不存在则输出-1。单增栈循环数组用模运算实现int* nextGreaterElements(int* nums, int numsSize, int* returnSize) { int* ans malloc(sizeof(int)*numsSize); memset(ans, -1, sizeof(int)*numsSize); int stk[numsSize*2]; memset(stk, 0, sizeof(stk)); stk[0] 0; int top 0; for(int i 1; inumsSize*2; i){ // 遍历两次然后i对numsSize取模 while(top0 nums[stk[top]]nums[i%numsSize]){ ans[stk[top]] nums[i%numsSize]; top--; } stk[top] i%numsSize; } *returnSize numsSize; return ans; }例题42 - 接雨水hard给定n个非负整数表示每个宽度为1的柱子的高度图计算按此排列的柱子下雨之后能接多少雨水。单增栈横向观察凹槽填雨水--由于使用单增栈当前元素大于栈顶元素时进行计算操作又因为次栈顶元素大于栈顶元素横向形成凹槽故重点在于记录当前元素栈顶元素和次栈顶元素heightmin(当前元素次栈顶元素)-栈顶元素widthright-left-1height0时sumheight*width#define MIN(a, b)((a)(b)?(a):(b)) int trap(int* height, int heightSize) { int* stk calloc(heightSize, sizeof(int)); int sum 0; stk[0] 0; int top 0; for(int i 1; iheightSize; i){ while(top height[stk[top]]height[i]){ // 由于要得到次栈顶,故top0 int mid stk[top],left stk[top-1], right i; int h MIN(height[left], height[right])-height[mid]; int w right-left-1; if(h0)sum h*w; // 有凹陷 top--; } stk[top] i; } free(stk); return sum; }例题84 - 柱状图中最大矩阵hard给定n个非负整数用来表示柱状图中各个柱子的高度。每个柱子彼此相邻且宽度为 1 。求在该柱状图中能够勾勒出来的矩形的最大面积。单减栈做法和上一题42类似每个索引对应长度横向扩展成矩形由于求最大面积那么就是找下一个较小元素问题记录当前面积更新同样需要记录left, mid, right// 暴力思路--找到当前位置元素左边和右边第一个比他小的记录h与w更新ans // 超时91/99 int largestRectangleArea(int* heights, int heightsSize) { int ans 0; for(int i 0; iheightsSize; i){ int h heights[i], left -1, right heightsSize; for(int l i-1; l0; l--){ if(heights[l]h){ left l; break; } } for(int r i1; rheightsSize; r){ if(heights[r]h){ right r; break; } } int w right-left-1; ans fmax(ans, h*w); } return ans; } // 根据暴力思路利用单调栈 // 栈底-栈顶为递增那么自然次栈顶元素栈顶元素即左边第一个比他小的 // 然后遍历过程中遇到i比栈顶小即右边第一个比栈顶元素小的 #define MAX(a,b)((a)(b)?(a):(b)) int largestRectangleArea(int* heights, int heightsSize) { int* h malloc(sizeof(int)*(heightsSize2)); h[0] h[heightsSize1] 0; memcpy(h1, heights, sizeof(int)*heightsSize); int area 0; int* stk calloc(heightsSize2, sizeof(int)); stk[0] 0; int top 0; for(int i 1; iheightsSize2; i){ while(top h[i]h[stk[top]]){ int mid stk[top--]; int left stk[top], right i; int a h[mid]; int b right-left-1; area MAX(area, a*b); } stk[top] i; } return area; }
ubuntu系统 UE5+Project AirSim 链接: dev_setup_linux developing-projectairsim-libs controllers vscode打开/home/insky/airsim/ProjectAirSim/unreal/Blocks下Blocks.code-workspace文件 simple controlller source ~/airsim/virtualenv/airsim-venv/bin/activate cd ~/airsim/ProjectAirSi… 2026/5/17 10:38:56
现代智能汽车系统——APXpress APXpress技术通过30Gbps高带宽传输、128条虚拟数据路径和纯硬件封装机制,彻底革新了汽车数据互联方式。其突破性在于:支持任意拓扑结构,实现多源异构数据的灵活路由;提供确定性低延迟传输,满足自动驾驶实时性需求&… 2026/7/6 4:54:05
U-VIP-SLAM U-VIP-SLAM复现 环境:ubuntu20.04,ROS 1 noetic,Opencv3.4.8,Pangolin,Boost 1.71.0.0 数据集硬件配置: Depthtopic:/barometer_node/depth,sensor_msgs/FluidPressure 深度/气压… 2026/5/17 12:21:31
树莓派5基础常用指令 一、关机与重启指令(核心常用)关机操作立即完全断电关机(推荐) 树莓派 5 执行后会彻底停止运行并切断电源输出,是最安全的关机方式bash运行sudo poweroff立即安全关机 系统停止所有服务后进入停机状态,树莓… 2026/7/7 11:39:08
《鬼城杀》暴力美学技术解析:从特效到流媒体优化的制作实践 🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近Netflix全球排行榜上出现了一个引人注目的现象:日版《鬼城杀》以压倒性的观看量登顶第一。这部作品以其独特的暴力美学… 2026/7/7 11:39:08
链上资产隐匿场景下的溯源追踪与密钥提取技术方法 链上资产隐匿场景下的溯源追踪与密钥提取技术方法 摘要: 本文从取证技术视角,分析一起涉及链上资产隐匿的案件中,侦查机关如何通过服务器日志分析、资金溯源系统追踪、加密网盘穿透和密钥提取完成证据闭环。 一、侦查起点:网络巡查… 2026/7/7 11:39:08
3步轻松掌握YaeAchievement:原神成就导出神器使用指南 3步轻松掌握YaeAchievement:原神成就导出神器使用指南 【免费下载链接】YaeAchievement 更快、更准的原神数据导出工具 项目地址: https://gitcode.com/gh_mirrors/ya/YaeAchievement YaeAchievement是一款专为原神玩家设计的成就数据导出工具,能… 2026/7/7 11:35:07
5个核心功能完全重塑你的GTA5线上游戏体验:开源小助手使用指南 5个核心功能完全重塑你的GTA5线上游戏体验:开源小助手使用指南 【免费下载链接】GTA5OnlineTools GTA5线上小助手 项目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools 在广阔的洛圣都世界中,你是否曾因漫长的跑图时间而疲惫࿱… 2026/7/7 11:33:07
WorkshopDL:轻松下载Steam创意工坊模组的终极解决方案 WorkshopDL:轻松下载Steam创意工坊模组的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为无法访问Steam创意工坊而烦恼吗?无论你使用… 2026/7/7 11:33:07
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践 1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8… 2026/7/7 0:01:11
如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是… 2026/7/7 0:03:13
Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 【免费下载链接】Jailhouse-gui A graphical user interface (GUI) tool for configuring and managing Jailhouse, a Linux-based hypervisor for partitioning multicore processors into isolated cel… 2026/7/7 0:03:13
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/7 11:26:57
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/7 11:26:58