柱状图中最大的矩形 - 困难

*************

c++

topic: 84. 柱状图中最大的矩形 - 力扣(LeetCode)

*************

chenck the topic first:

Think about the topics I have done before. the rains project comes:盛最多水的容器 - 中等难度-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/ElseWhereR/article/details/144420793?spm=1001.2014.3001.5501

Double pointer was used. Here in this project double can be used to.

The most important is to caculate the area. So named variable area is area. Initialize the area 0.

class Solution {
public:int largestRectangleArea(vector<int>& heights) {int area = 0;// do something here}
};

 area = length × heigth;

height is eazy to be seen which is min(heights[i], height[j]);

length is easy too which is j - i + 1;

next step is how to loop? 

refer to the rains problem:

class Solution {
public:int largestRectangleArea(vector<int>& heights) {int n = heights.size();int max_area = 0;for (int i = 0; i < n; i++) {int minHeight = heights[i];  // 初始化最小高度为当前柱子的高度for (int j = i; j >= 0; j--) {  // 内层循环应从i向左遍历if (heights[j] < minHeight) {minHeight = heights[j];}int width = i - j + 1;int area = minHeight * width;if (area > max_area) {max_area = area;}}}return max_area;}
};

and overtime comes like old friend:

 aesthetics of violence always works.

Change the way to reduce the loop times.

Introduce Mr. Stack:

not that stack, but this  stack:

class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> s;  // 存储柱子的下标int max_area = 0;int n = heights.size();for (int i = 0; i <= n; i++) {int h = (i < n) ? heights[i] : 0;while (!s.empty() && h < heights[s.top()]) {int top = s.top();s.pop();int left = s.empty() ? -1 : s.top();int width = i - left - 1;int area = heights[top] * width;max_area = max(max_area, area);}s.push(i);}return max_area;}
};

In c++, stack means one type of data structure. The stack structure is used to 存储函数调用时的参数、局部变量和返回地址。每当一个函数被调用时,相关的信息被压入栈中;当函数执行完毕后,这些信息被弹出栈,以便返回到调用函数。

Stack kickss pointer j out.

  1. The important thing is making a stack, the stack is progressive increase.
  2. When a height smaller than the top of the stack is encountered, the top of the stack is popped and the area of the rectangle with that height as the lowest is calculated.
  3. refresh the max_area.

For example: 

heights = [2, 1, 5, 6, 2, 3]

i012345
h215623
    • i = 0:

      • h = heights[0] = 2

      • 栈为空,直接压入0,栈 = [0]。

    • i = 1:

      • h = heights[1] = 1

      • 1 < heights[0] = 2,弹出0,计算面积:

        • left = -1width = 1 - (-1) - 1 = 1area = 2 * 1 = 2

      • 压入1,栈 = [1]。

    • i = 2:

      • h = heights[2] = 5

      • 5 >= heights[1] = 1,直接压入2,栈 = [1, 2]。

    • i = 3:

      • h = heights[3] = 6

      • 6 >= heights[2] = 5,直接压入3,栈 = [1, 2, 3]。

    • i = 4:

      • h = heights[4] = 2

      • 2 < heights[3] = 6,弹出3,计算面积:

        • left = 2width = 4 - 2 - 1 = 1area = 6 * 1 = 6max_area = 6

      • 2 < heights[2] = 5,弹出2,计算面积:

        • left = 1width = 4 - 1 - 1 = 2area = 5 * 2 = 10max_area = 10

      • 压入4,栈 = [1, 4]。

    • i = 5:

      • h = heights[5] = 3

      • 3 >= heights[4] = 2,直接压入5,栈 = [1, 4, 5]。

    • i = 6:

      • h = 0

      • 0 < heights[5] = 3,弹出5,计算面积:

        • left = 4width = 6 - 4 - 1 = 1area = 3 * 1 = 3max_area = 10

      • 0 < heights[4] = 2,弹出4,计算面积:

        • left = 1width = 6 - 1 - 1 = 4area = 2 * 4 = 8max_area = 10

      • 0 < heights[1] = 1,弹出1,计算面积:

        • left = -1width = 6 - (-1) - 1 = 6area = 1 * 6 = 6max_area = 10

      • 压入6,栈 = [6]。

  1. 返回最大面积

    • max_area = 10

It works. And the next step is to write the code:

the first is to innitialize some variable

class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> s;  // 存储柱子的下标int max_area = 0;int n = heights.size();// do something here}
};

and caculate the area :

class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> s;  // 存储柱子的下标int max_area = 0;int n = heights.size();// do something hereint area = heights[top] * width; // caculate the areamax_area = max(max_area, area);  // fresh the max area}
};

how to find the width?

class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> s;  // 存储柱子的下标int max_area = 0;int n = heights.size();// do something hereint width = i - left - 1; // find the widthint area = heights[top] * width; // caculate the areamax_area = max(max_area, area);  // fresh the max area}
};

and what is left?

class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> s;  // 存储柱子的下标int max_area = 0;int n = heights.size();// do something hereint left;if (s.empty()) {left = -1;} else {left = s.top();}int width = i - left - 1; // find the widthint area = heights[top] * width; // caculate the areamax_area = max(max_area, area);  // fresh the max area}
};

make the loop

class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> s;  // 存储柱子的下标int max_area = 0;int n = heights.size();for (int i = 0; i <= n; i++) {int h;if (i < n) {h = heights[i];} else {h = 0;}int left;if (s.empty()) {left = -1;} else {left = s.top();}int width = i - left - 1; // find the widthint area = heights[top] * width; // calculate the areamax_area = max(max_area, area);  // refresh the max area} else {break; // 如果h不小于栈顶元素的高度,退出循环}} return max_area;}
};

int h

class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> s;  // 存储柱子的下标int max_area = 0;int n = heights.size();for (int i = 0; i <= n; i++) {int h;if (i < n) {h = heights[i];} else {h = 0;}while (true) {if (!s.empty()) {if (h < heights[s.top()]) {int top = s.top();s.pop(); // kick your assint left;if (s.empty()) {left = -1;} else {left = s.top();}int width = i - left - 1; // find the widthint area = heights[top] * width; // calculate the areamax_area = max(max_area, area);  // refresh the max area} else {break; // 如果h不小于栈顶元素的高度,退出循环}} else {break; // 如果栈为空,退出循环}}s.push(i); // add it}return max_area;}
};

done

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

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

相关文章

【SQL server】教材数据库(5)

使用教材数据库&#xff08;1&#xff09;中的数据表完成以下题目&#xff1a; 1 根据上面基本表的信息定义视图显示每个学生姓名、应缴书费 2 观察基本表数据变化时&#xff0c;视图中数据的变化。 3利用视图&#xff0c;查询交费最高的学生。 1、create view 学生应缴费视…

spring入门程序

安装eclipse https://blog.csdn.net/qq_36437991/article/details/131644570 新建maven项目 安装依赖包 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

Spring-Mybatis 2.0

前言&#xff1a; 第一点&#xff1a;过于依赖代码生成器或AI&#xff0c;导致基于mybaits的CRUD通通忘了&#xff0c;所以为了找回遗忘的记忆&#xff0c;有了该系列内容。 第二点&#xff1a;通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能…

在线免费批量生成 Word 文档工具

为了方便的批量生成 Word 文档&#xff0c;写了个在线 Word 文档批量生成工具&#xff0c;可以根据 Excel 数据和 Word 模板批量生成大量个性化的 Word 文档。适用于需要批量生成格式统一但内容不同的文档场景。比如&#xff1a; 批量生成证书、奖状批量生成合同、协议批量生成…

R语言6种将字符转成数字的方法,写在新年来临之际

咱们临床研究中&#xff0c;拿到数据后首先要对数据进行清洗&#xff0c;把数据变成咱们想要的格式&#xff0c;才能进行下一步分析&#xff0c;其中数据中的字符转成数字是个重要的内容&#xff0c;因为字符中常含有特殊符号&#xff0c;不利于分析&#xff0c;转成数字后才能…

NVR管理平台EasyNVR设备通过ONVIF接入出现404访问错误是什么原因?

如今&#xff0c;视频监控在各行各业都得到了广泛应用&#xff0c;成为现代社会不可或缺的一部分。随着技术的不断进步&#xff0c;视频监控系统已经从传统的模拟监控发展到高清化、网络化和智能化阶段&#xff0c;其应用领域也从最初的安防扩展到智慧城市、智能家居、交通管理…

深度学习——神经网络中前向传播、反向传播与梯度计算原理

一、前向传播 1.1 概念 神经网络的前向传播&#xff08;Forward Propagation&#xff09;就像是一个数据处理的流水线。从输入层开始&#xff0c;按照网络的层次结构&#xff0c;每一层的神经元接收上一层神经元的输出作为自己的输入&#xff0c;经过线性变换&#xff08;加权…

MySQL线上事故:使用`WHERE`条件`!=xxx`无法查询到NULL数据

前言 在一次 MySQL 的线上查询操作中&#xff0c;因为 ! 的特性导致未能正确查询到为 NULL 的数据&#xff0c;险些引发严重后果。本文将详细解析 NULL 在 SQL 中的行为&#xff0c;如何避免类似问题&#xff0c;并提供实际操作建议。 1. 为什么NULL会查询不到&#xff1f; 在…

如何修复 WordPress 中的“Error establishing a database connection”问题

如何修复 WordPress 中的“Error establishing a database connection”问题 在使用 WordPress 建站时&#xff0c;如果你看到“Error establishing a database connection”的提示&#xff0c;不要慌张。这通常意味着网站无法连接到数据库&#xff0c;因此无法显示内容。下面…

MySQL数据库的锁

一、锁&#xff08;Lock&#xff09; 1. 概念 数据库锁是数据库管理系统中用来管理对数据库对象&#xff08;如行、页或表&#xff09;的并发访问的机制。 其主要目的是确保数据的完整性和一致性&#xff0c;同时允许合理的并发操作。 数据库锁可以防止多个事务同时修改同一…

20241218-信息安全理论与技术复习题

20241218-信息安全理论与技术复习题 一、习题1 信息安全的基本属性是&#xff08;D )。 A、机密性 B、可用性 C、完整性 D、上面 3 项都是 “会话侦听和劫持技术” 是属于&#xff08;B&#xff09;的技术。 A、 密码分析还原 B、 协议漏洞渗透 C、 应用漏洞分析与渗透 D、 D…

C语言实现贪吃蛇游戏

文章目录 一、贪吃蛇目录1.游戏背景2.游戏实现效果3.项目目标4.项目所需的C语言基础知识5.Win32 API介绍5.1 Win32 API5.2 控制台程序5.3 控制台屏幕上的坐标COORD5.4 [GetStdHandle](https://learn.microsoft.com/zh-cn/windows/console/getstdhandle)5.5 [GetConsoleCursorIn…

CA系统的设计(CA证书生成,吊销,数字签名生成)

CA系统概述 CA认证系统是一种基于公钥密码基础设施&#xff08;PKI&#xff09;的信息安全技术&#xff0c;它可以为网络通信双方提供身份认证、数据加密、数字签名等功能。CA认证系统的核心是证书授权机构&#xff08;CA&#xff09;&#xff0c;它负责为用户&#xff08;节点…

《代码随想录》Day21打卡!

写在前面&#xff1a;祝大家新年快乐&#xff01;&#xff01;&#xff01;2025年快乐&#xff0c;2024年拜拜~~~ 《代码随想录》二叉树&#xff1a;修剪二叉搜索树 本题的完整题目如下&#xff1a; 本题的完整思路如下&#xff1a; 1.本题使用递归进行求解&#xff0c;所以分…

XQR5VFX130-1CN1752V,,具有高度的可编程性和灵活性的FPGA中文技术资料

XQR5VFX130-1CN1752V概述 &#xff1a; 高性能空间级Virtex-5QV FPGA将无与伦比的密度、性能和抗辐射能力与可重新配置的灵活性结合在一起&#xff0c;而无需承担 ASIC 的高风险。 丰富的系列级块&#xff1a;可满足各种高级逻辑设计和许多专用系统级块的需求。包括功能强大的3…

HTML——16.相对路径

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><a href"../../fj1/fj2/c.html" target"_blank">链接到c</a><!--相对路径&#xff1a;-->…

Typescript 【详解】类型声明

值类型 // 字符串 let myNname: string "朝阳";// 数字 let num: number 10;// 布尔类型 let ifLogin: boolean true; // 布尔类型支持赋值计算之后结果是布尔值的表达式 let bool: boolean !!0// null let n: null null;// undefined let u: undefined undefi…

区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】

区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】 1.1 漏洞分析1.2 漏洞合约1.3 攻击分析1.4 攻击合约 重点&#xff1a;MaxMint721 漏洞合约的 mint 函数调用了 ERC721 合约中的 _checkOnERC721Received 函数&#xff0c;触发 to 地址中实…

写在2024的最后一天

落笔不知何起&#xff0c;那就从开始道来吧。 2024的元旦节后入职了一家新公司&#xff0c;一开始是比较向往的&#xff0c;也许是因为它座落在繁华街道的高档写字楼之中&#xff0c;又或许是因为它相较于以往的公司而言相对正规些。但接触了公司代码后&#xff0c;我有了…

自动化测试-Pytest测试

目录 pytest简介 基本测试实例 编写测试文件 执行测试 pytest运行时参数 mark标记 Fixture pytest插件 Allure测试报告 测试步骤 pytest简介 Pytest‌是一个非常流行的Python测试框架&#xff0c;它支持简单的单元测试和复杂的功能测试&#xff0c;具有易于上手、功…