0

0

C++怎么实现单调栈_C++解决直方图最大矩形【算法】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-01 14:39:10

|

793人浏览过

|

来源于php中文网

原创

单调栈防越界核心是栈存索引且每次调用top前必判空;直方图最大矩形需在末尾补0以清空栈并计算所有情况;面积计算须用long long防溢出,宽度公式为i - left_bound - 1。

c++怎么实现单调栈_c++解决直方图最大矩形【算法】

单调怎么写才不会越界

核心是栈里只存索引,不是存值;每次弹栈前必须检查栈是否为空。C++ 的 std::stack 不支持随机访问,也不能用 top() 之前不判空——这是最常崩的地方。

  • 初始化栈时用 std::stack<int> stk;</int>,只压入下标(比如 i),别压 heights[i]
  • 遍历到 i 时,只要 !stk.empty() && heights[i] 就持续弹栈
  • 弹栈后立刻用 stk.empty() ? -1 : stk.top() 算左边界,避免访问空栈的 top()
  • 右边界就是当前 i,左边界是弹完后栈顶(或 -1),宽度 = i - left - 1

直方图最大矩形为什么必须补0

不补哨兵会导致末尾一段递增序列永远没机会被计算。比如 [2,3,4,5] 全进栈后循环结束,但所有高度对应的矩形都没算。

  • heights 末尾 push 一个 0,强制清空栈并触发全部计算
  • 不要在开头加 -1 或 0:左边界逻辑会变复杂,且 C++ 中负索引不合法
  • 补 0 后数组长度 +1,遍历范围变成 [0, n)n = heights.size()
  • 这个 0 只参与计算,不作为有效柱子,所以面积公式里高度取 heights[stk.top()] 没问题

用 vector 模拟栈比 stack 更稳吗

真没必要换。标准 std::stack 完全够用,反而用 vector 手动维护容易写错 pop_back() 和边界判断。

Booltool
Booltool

常用AI图片图像处理工具箱

下载
  • std::stacktop()/pop()/empty() 语义清晰,编译器优化也成熟
  • 有人想用 vector 是为了访问倒数第二个元素——但单调栈根本不需要,只依赖栈顶
  • 若真要调试,临时改成 vector 并打印 v.back() 可以,但上线别留
  • 性能上无差异:两者底层都是连续内存,stack 默认适配器就是 deque,但换成 vector 也没坏处

LeetCode 84 题卡在 96/97 个用例怎么办

几乎全是整型溢出或下标越界。尤其注意宽度计算时的减法顺序和 int 类型范围。

立即学习C++免费学习笔记(深入)”;

  • 面积用 long long 存,别用 intheights[i] 最大 1e4,宽度最大 1e5,乘积超 INT_MAX
  • 左边界变量命名别叫 left,叫 left_bound,避免和循环变量 left 混淆
  • stk 弹空后,左边界是 -1,此时宽度 = i - (-1) - 1 == i,别手抖写成 i - 1
  • 测试用例 [1][0] 必须过:补 0 后变成 [1,0][0,0],逻辑要能扛住

边界条件比算法本身更花时间——栈空判断、补零位置、宽度公式里的 -1,三个地方错一个就挂。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

890

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

595

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

429

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

599

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

483

2023.08.14

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

20

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

15

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号