代码随想录打卡第四十九天

news2024/11/18 13:59:48

代码随想录–单调栈部分

day 49 单调栈第二天


文章目录

  • 代码随想录--单调栈部分
  • 一、力扣42--接雨水
  • 二、力扣84--柱状图中最大的矩形


一、力扣42–接雨水

代码随想录题目链接:代码随想录

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

方法一是暴力搜索
在这里插入图片描述
遍历每一列,对每一列都求两侧高度最大的列,这样每列能放的雨水加起来就是全部雨水。会超时

这一想法可以用双指针优化,也就是将左右最高的列提前存好,类似动态规划的想法

maxLeft[0] = height[0];
for (int i = 1; i < size; i++) {
    maxLeft[i] = max(height[i], maxLeft[i - 1]);
}

这样maxLeft[index]存的就是第index列左侧最高的列,同理能获得右侧最高的列

那么只要再进行一次遍历列,左侧最高和右侧最高取最小,减去本列高度即可获得每列雨水,时间复杂度从 O ( n 2 ) O(n^2) O(n2)降到 O ( n ) O(n) O(n)

class Solution {
public:
    int trap(vector<int>& height) {
        if(height.size() <= 2) return 0;
        vector<int> maxLeft(height.size(), 0);
        vector<int> maxRight(height.size(), 0);
        int length = height.size();

        maxLeft[0] = height[0];
        maxRight[0] = height[length - 1];
        for(int i = 1; i < length; i ++) maxLeft[i] = max(maxLeft[i-1], height[i-1]);
        for(int i = length - 2; i >= 0; i --) maxRight[i] = max(maxRight[i + 1], height[i + 1]);

        int result = 0;
        for(int i = 1; i < length - 1; i ++)
            result += max(0, min(maxLeft[i], maxRight[i]) - height[i]);
        return result;

    }
};

单调栈是按照行方向计算雨水的在这里插入图片描述
明显能够感觉到,应该是递减的一个栈,只要有比栈顶更大的元素要进来了,就得处理,因为此时是可以放下雨水的

其他元素进来时,并不影响雨水的放置,那就正常进

所以只需要考虑怎么处理更大元素进来时的操作

在这里插入图片描述
根据图可以明显的看出来,接水需要三个元素,也就是:

取出栈顶,作为碗的底
新的栈顶作为左边界,和右边的边界取最小值,减去底的高度,就能够知道水的高度了
再计算左右边界的距离,就可以知道水的高度,相乘就是最后的容量

代码如下:

class Solution {
public:
    int trap(vector<int>& height) {
        stack<int> st;
        st.push(0);
        int result = 0;
        for(int i = 1; i < height.size(); i ++)
        {
            if(height[i] <= height[st.top()]) st.push(i);
            else
            {
                while(!st.empty() && height[i] > height[st.top()])
                {
                    int botton = st.top();
                    st.pop();
                    if(!st.empty())
                    {
                        result += (min(height[i], height[st.top()]) - height[botton]) * (i - st.top() - 1);
                    }
                }
                st.push(i);
            }
        }
        return result;

    }
};

二、力扣84–柱状图中最大的矩形

代码随想录题目链接:代码随想录

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

和接雨水的思路是一样的,但是反过来,要递增

当比栈顶小的元素要进来的时候,取栈顶元素出来,作为高,再计算新栈顶和新元素之间距离,作为宽,即可求得新矩阵大小

与储存结果比较,即可保证储存最大值

代码如下:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> st;
        st.push(0);
        heights.insert(heights.begin(), 0);
        heights.push_back(0);

        int result = 0;
        for(int i = 1; i < heights.size(); i ++)
        {
            if(heights[i] >= heights[st.top()]) st.push(i);
            else
            {
                while(!st.empty() && heights[i] < heights[st.top()])
                {
                    int h = heights[st.top()];
                    st.pop();
                    result = max(
                        result,
                        h * (i - st.top() - 1)
                    );
                }
                st.push(i);
            }
        }
        return result;
    }
};

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

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

相关文章

HexView 刷写文件脚本处理工具-基本功能介绍(十)-数据自动对齐与填充

文件 在二进制文件被编译出来后,如果没有在链接文件中进行填充的话,通常都是分段落的,还有一些不需要的信息在里面,如果没有对齐的话可以用hexview进行对齐。 一般还会要求进行数据的填充,这样的话释放的刷写文件就是一个整体的段落。 数据对齐 数据对齐操作是基于块的…

使用WPF将window 添加到TabControl里面的方法

首先 1.window 不能添加到其他控件中&#xff0c;原因是他是最高级的。。 在window usercontrol&#xff0c;以及page&#xff0c;frame 基本都遵循这个道理&#xff0c;可以添加的则是 除window以外的其他窗体。 2.添加到TabControl 下面的TabItem 控件添加usercontrl我遇到的…

AMEYA360:灵动微电子MM32SPIN0230为核,打造All-in-One智能功率模块

全新电动牙刷市场、小风机市场革新性选择MM32SPIN028C即将发布! 在个人护理日益受到重视的今天&#xff0c;电动牙刷市场正迎来前所未有的增长&#xff0c;而手持风扇也在消费电子领域迅速崛起。作为位居前列的的中国本土32位MCU供应商&#xff0c;灵动微电子宣布将在近期与合作…

\si{\angstrom} 埃米 latex 显示

使用 textcomp 包&#xff1a; 这个包提供了许多额外的文本符号&#xff0c;包括埃米符号。在导言区添加&#xff1a; \usepackage{textcomp} 然后在文档中使用&#xff1a; \textangstrom 使用 gensymb 包&#xff1a; 这个包也提供了埃米符号。在导言区添加&#xff1a; \…

蛋白质生物学:从序列到结构和疾病 下载并同时打开1LYZ和1H6M的PDB文件(提交图片)。描述这种蛋白质的二级和三级结构。(10分)

Download and open the PDB files of 1LYZ and 1H6M together in one view (submit an image). Describe the secondary and tertiary structure of this protein. (10 marks) 下面给出完整详细的解答&#xff1a; 同时打开1LYZ和1H6M的PDB文件得到&#xff1a; 首先二级结构…

小型并网式光伏气象站:光伏电站的智能守护者

小型并网式光伏气象站以其独特的功能和优势&#xff0c;成为了电站高效运行的智能守护者。小型并网式光伏气象站通过精准的数据采集与分析&#xff0c;为光伏电站的运维管理提供了强有力的支持。 小型并网式光伏气象站能够实时监测并记录光伏电站周围环境的多种气象参数&#x…

黑马头条vue2.0项目实战(六)——文章搜索

目录 1. 创建组件并配置路由 2. 页面布局 3. 处理页面显示状态 4. 搜索联想建议 4.1 基本功能 4.2 防抖优化 4.3 搜索关键字高亮 5. 搜索结果 5.1 获取搜索关键字 5.2 请求获取数据 5.3 模板绑定 6. 搜索历史记录 6.1 添加历史记录 6.2 展示历史记录 6.3 删除历史…

Nacos集群模式-window版

结构图 步骤 复制一份nacos改为nacos8850##### 修改conf/application.properties再复制nacos改为nacso8860,nacos8870,只需要修改端口号即可 创建数据库nacos 先创建一个名为nacos的数据库&#xff0c;再直接把表拖进去即可 修改cluster.conf.example文件 把该文件名该为clus…

Linux云计算 |【第二阶段】NETWORK-DAY2

主要内容&#xff1a; VLAN技术、TRUNK模式、链路聚合、路由器 一、VLAN技术应用 广播域指接受同样广播消息的节点的集合&#xff0c;如在该集合中的任何一个节点传输一个广播帧&#xff0c;则所有其它能收到这个帧的节点都被认为是该广播帧的一部分&#xff1b; 交换机的所有…

刀片式远程IO

一、功能概述 1.1设备结构 本产品是三格电子远程IO系列刀片式型号&#xff0c;以下刀片式IO。 刀片式IO旨在帮助用户在自动化项目上更便捷的选型和应用。为此刀片式IO采用耦合器和IO模块通过背板总线结合的方式&#xff0c;方便用户根据不同使用场景&#xff0c;灵活搭配扩展…

ITIL服务管理认知与实践

ITIL服务管理认知与实践 ITIL 是什么 ITIL(Information Technology Infrastructure Library&#xff0c;信息技术基础架构库)ITIL的创建旨在解决当年英国政府部门在IT服务管理中存在的混乱和低效问题&#xff0c;提高政府的运营效率和公众服务水平。 发展情况 ITIL最初由英…

springboot仓库仓储管理系统-计算机毕业设计源码14514

目录 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.1.1技术可行性 2.1.2经济可行性 2.1.3操作可行性 2.1.4法律可行性 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加…

Python编码系列—Python装饰器:编写可复用功能的魔法棒

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

kafka零拷贝sendfile及mmap简述

概述 通常在选型比较消息中间件时&#xff0c;都会在备选栏有kafka&#xff1b; kafka突出的特点就是高吞吐&#xff0c;零拷贝&#xff1b; 这里的零拷贝其实就是内核和用户空间之间没有copy&#xff0c;并不是真的0拷贝&#xff1b; 毕竟数据在磁盘&#xff0c;要读到网卡发…

Linux源码阅读笔记19-插入删除模块实战

前面已经讲了Linux模块的基本知识&#xff0c;现在我们来熟悉一下模块相关的基本操作。 模块的编写 #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h>// 插入内核时的函数 static int __init lnm_init(void) {printk("h…

CAN通信(速记版)

CAN 总线简介 CAN 协议经过 ISO 标准化后有两个标准:ISO11898 标准和 ISO11519-2 标准。前者适用通信速率为 125Kbps~1Mbps 场景,后者适用 125Kbps 以下场景。 STM32 自带基本扩展 CAN(bxCAN)。它支持 CAN 协议 2.0A 和 2.0B,都属于11898标准。支持最高传输速率为1 Mbps。CA…

2024河南萌新联赛第(四)场 河南理工大学

B.小雷的神奇电脑 题目&#xff1a; 原题链接 给出量个数n,m&#xff0c;一个有n个数的数组&#xff0c;数组里每个数不超过2^m&#xff0c;求数组任意两个数同或后的最大值。同或定义&#xff1a;二进制下相同为1&#xff0c;不同为0。 思路&#xff1a; 观察同或的定义可…

第十二章:设置pod和容器权限-保障集群内节点和⽹络安全

本章内容包括&#xff1a; 在pod中使用宿主机节点的默认Linux命名空间以不同用户身份运行容器运行特权容器添加或禁用容器内核功能定义限制pod行为的安全策略保障pod的网络安全 谈到了如何保障API服务器的安全。如果攻击者获得了访问API服务器的权限&#xff0c;他们可以通过在…

虹科新品 | PDF记录仪新增蓝牙®接口型号HK-LIBERO CL-Y

新品发布&#xff01;HK-LIBERO CE / CH / CL产品家族新增蓝牙接口型号HK-LIBERO CL-Y&#xff01; PDF记录仪系列新增蓝牙接口型号 HK-LIBERO CL-Y HK-LIBERO CE、HK-LIBERO CH和HK-LIBERO CL&#xff0c;虹科ELPRO提供了一系列高品质的蓝牙&#xff08;BLE&#xff09;多用途…

锂电池充电板电路设计

写这篇文章的目的主要是个人经验的总结&#xff0c;希望能给开发者们提供一种锂电池充电电路以及电源显示的电路思路。接下来从以下几个方面讲述电路。 设计这款电路的初衷是想用一块硬币大小的锂电池作为供电电源&#xff08;3.5V-4.2V&#xff09;&#xff0c;降压供给3.3V电…