代码随想录:动态规划4-5

news2024/9/21 21:52:52

42.接雨水

题目

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

示例 1:

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

代码

class Solution {
    public int trap(int[] height) {

        //雨水的关键是找凹槽,凹槽是栈顶的mid,右边柱子是当前更大的元素,左边的柱子是栈顶下面的元素
        //单调递减栈:寻找右边第一个更大的元素
        Stack<Integer> stack = new Stack<>();
        //栈中放的是元素下标,第一个元素入栈,高度=height[0]
        stack.push(0);

        int sum = 0;  //初始雨水

        //i是当前元素下标,height[i]是当前元素高度
        for(int i=1; i < height.length; i++){
            //当前元素高度 < 栈顶元素高度
            if(height[i] < height[stack.peek()]){
                stack.push(i);  //当前元素下标入栈
            }
            //当前元素高度 = 栈顶元素高度
            else if(height[i] == height[stack.peek()]){
                //因为栈顶高度和当前元素高度,栈顶的柱子肯定没有雨水
                stack.pop();  //栈顶元素入栈
                stack.push(i);  //当前元素下标入栈
            }
            //当前元素高度 > 栈顶元素高度,出现凹槽
            else{
                //只要当前元素高度比栈顶元素高度大,循环处理所有凹槽
                while(!stack.isEmpty() && height[i] > height[stack.peek()]){
                    int mid = stack.pop();  //凹槽下标

                    //mid出栈后,如果栈为空,说明mid左边是空的,没有雨水,[1],mid=1,1出栈就行
                    //mid出栈后,如果栈非空,说明mid左边不空,有雨水,需要计算雨水量
                    if(!stack.isEmpty()){
                        int left = stack.peek();  //凹槽左边下标
                        //mid凹槽的雨水高度 = 左右高度最小值-凹槽高度
                        int h = Math.min(height[i], height[left]) - height[mid];
                        //mid凹槽的雨水宽度
                        int w = i - left - 1;  //这里要写- left - 1,不能写-mid,[4,2,0,3,2,5]画个图就知道了
                        int area = h * w;  //mid凹槽雨水量
                        sum += area;   
                    }
                }
                stack.push(i);//当前元素下标入栈
            }
        }
        return sum;  //返回总雨水量
    }
}

84.柱状图中最大的矩形

题目

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

输入: heights = [2,4]
输出: 4

代码

class Solution {
    public int largestRectangleArea(int[] heights) {
        //关键是找变小的元素,变小了,就把前面的矩形面积计算出来

        //扩容,头尾加元素0
        int[] newHeights = new int[heights.length + 2];
        //头部加0,防止出现[8,6,4,2]递减序列算出来是0
        newHeights[0] = 0;
        //尾部加0,防止出现[2,4,6,8]递增序列算出来是0
        newHeights[newHeights.length - 1] = 0;
        //数组copy
        for(int i=0; i < heights.length; i++){
            newHeights[i+1] = heights[i];
        }

        int res = 0; //初始最大面积
        //单调栈,找右边第一个更小的元素
        Stack<Integer> stack = new Stack<>();
        //第一个元素下标入栈
        stack.push(0);  

        for(int i=1; i < newHeights.length; i++){
            //当前元素高度 > 栈顶元素高度
            //举例:[1,5,6]持续入栈
            if(newHeights[i] > newHeights[stack.peek()]){
                stack.push(i);  //下标入栈
            }
            //当前元素高度 = 栈顶元素高度
            //举例:[1,5,5,6],当前元素=2,最大值会在第一个5取到,5不用出栈
            else if(newHeights[i] == newHeights[stack.peek()]){
                stack.push(i);  //下标入栈
            }
            //当前元素高度 < 栈顶元素高度
            else{
                //[1,5,6],当前元素=2,要出栈循环计算矩形大小
                while(!stack.isEmpty() && newHeights[i] < newHeights[stack.peek()]){
                    int mid = stack.pop();  //6的下标
                    if(!stack.isEmpty()){
                        int left = stack.peek();  //5的下标
                        int h = newHeights[mid]; //高度是6
                        int w = i - left - 1;  //宽度是1
                        int area = h * w; //面积是6
                        res = Math.max(res, area);  //更新最大矩形面积
                    }
                }
                stack.push(i);
            }
        }
        return res;
    }
}

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

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

相关文章

PyQt5-QCheckBox-开关按钮

效果预览 实现代码 from PyQt5.QtWidgets import QCheckBox, QApplication, QWidget, QVBoxLayout from PyQt5.QtCore import Qt, QRect, QPropertyAnimation, QEasingCurve, pyqtProperty from PyQt5.QtGui import QPainter, QColor, QPen, QFontclass CompactSwitchCheckbox…

PostgreSQL维护——解决索引膨胀和数据死行

注意&#xff1a; 本文内容于 2024-09-16 00:40:33 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;PostgreSQL维护——解决索引膨胀和数据死行。感谢您的关注与支持&#xff01; 我有一张表&#…

Python3网络爬虫开发实战(17)爬虫的管理和部署(第一版)

文章目录 一、 Scrapyd 分布式部署1.1 了解 Scrapyd1.2 准备工作1.3 访问 Scrapyd1.4 Scrapyd 的功能1.5 ScrapydAPI 的使用 二、Scrapyd-Client 的使用2.1 准备工作2.2 Scrapyd-Client 的功能2.3 Scrapyd-Client 部署 三、Scrapyd 对接 Docker3.1 准备工作3.2 对接 Docker 四、…

一款自动对杂乱文件进行整理和分类的AI工具--FileNeatAI

不知道大家有没有这样的痛点&#xff0c;面对自己的下载目录或者文档目录&#xff0c;总是下载了一堆文件&#xff0c;当某天看着这些文件夹想整理和分类的时候&#xff0c;又或者自己工作的时候&#xff0c;面对一堆工作上的文件&#xff0c;却不知道该分在那个分类里&#xf…

时序约束进阶三:Create_clock与Create_Generated_Clock详解

目录 一、前言 二、生成时钟 2.1 示例设计 2.2 主时钟约束 1&#xff09;约束对象解析 2&#xff09;约束到非时钟位置 2.3 生成时钟约束 1&#xff09;无约束 2&#xff09;倍频约束 3&#xff09;生成时钟的主时钟约束不正确 4&#xff09;使能时钟控制的约束 5&…

CI/CD持续集成和持续交付(git工具、gitlab代码仓库、jenkins)

目录 一 CICD是什么 1.1 持续集成&#xff08;Continuous Integration&#xff09; 1.2 持续部署&#xff08;Continuous Deployment&#xff09; 1.3 持续交付&#xff08;Continuous Delivery&#xff09; 二 git工具使用 2.1 git简介 2.2 git 工作流程 三 部署git …

[数据集][目标检测]车窗状态检测车窗开关检测数据集VOC+YOLO格式299张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;299 标注数量(xml文件个数)&#xff1a;299 标注数量(txt文件个数)&#xff1a;299 标注类别…

动态规划:07.路径问题_珠宝的最大价值_C++

题目链接&#xff1a;LCR 166. 珠宝的最高价值 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/description/ 一、题目解析 题目&#xff1a; 解析&#xff1a; 有过做前几道题的经验&#xff0c;我们会发现这道题其实就…

OpenAI o1——人工智能推理能力的飞跃,助力高级问题解决

前言 开放人工智能 新模型&#xff0c; OpenAI o1 或草莓&#xff0c;代表了 人工智能。它以 OpenAI 的 GPT 系列等先前模型为基础&#xff0c;并引入了增强的推理能力&#xff0c;从而加深了科学、编码和数学等各个领域的问题解决能力。与主要擅长处理和生成文本的前辈不同&a…

如何在win10Docker安装Mysql数据库?

1.拉取镜像 docker pull mysql 2.查看镜像 使用以下命令来查看是否已安装了 mysql镜像。 3.运行镜像 命令&#xff1a; docker run -p 3306:3306 --name mysql --restartalways --privilegedtrue \ -v /usr/local/mysql/log:/var/log/mysql \ -v /usr/local/mysql/data:/var…

AE电源HPG13150 400V Generator 手侧

AE电源HPG13150 400V Generator 手侧

【模板代码的组织结构与模板的显式实例化和声明】模板代码的组织结构与模板的显式实例化和声明

一、模板的组织结构 之前对于模板&#xff0c;我们都是写在同一个 . c p p .cpp .cpp文件下&#xff0c;那如果我们将模板分开&#xff0c;单独开一个 . h .h .h和 . c p p .cpp .cpp来创建模板&#xff0c;会发生什么&#xff1f; 首先&#xff0c;我们创建一个 m y c l a s…

适合骑行的开放式耳机哪个品牌好?四款开放式蓝牙耳机推荐

骑行时是否有必要佩戴耳机是一个需要权衡安全与便利的问题。因为虽然耳机能提供音乐、导航等功能&#xff0c;但也可能分散注意力&#xff0c;影响骑行安全。而且这也是需要看个人需求决定的&#xff0c;骑行戴耳机的需求是什么&#xff0c;我想大部分人应该就是为了接听电话&a…

大端存储与小端存储的存储方式

目录 1.小端存储方式的解释 2.大端存储方式的解释 3.百度笔试题--判断大端存储还是小端存储 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#xff01; 1.小端存储方式的解释 小端存储…

DeDeCMS靶场漏洞复现

打开靶场地址 姿势一&#xff1a;通过文件管理器上传webshell 1.登录后台 dedecms默认的后台登录地址为/dede 2.在附加管理里的文件式管理器中有文件上传 3.上传木马文件 4.访问木马文件 并连接 姿势二&#xff1a;修改模板文件获取webshell 1.点击模板里面的默认模板管理 …

【2025】智慧居家养老服务平台的设计与实现、基于AI的居家养老服务平台、居家养老服务平台开发、智慧养老服务平台设计

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

CAS 和 synchronized 的优化过程

&#x1f349; 目录 CAS 的实现 CAS 的工作原理 优化过程 CAS 的应用 1) 实现原子类 2&#xff09;实现自旋锁 CAS 的 ABA 问题 synchronized 的 原理 synchronized 基本特点 加锁工作过程 其他优化操作 1. 锁消除 2. 锁粗化 CAS&#xff08;Compare-And-Swap&…

反编译 AndroidManifest.xml文件-android反编译技术

一、安卓打包后目录 想要查看原来版本配置和关联信息&#xff0c;被打包了&#xff0c;这时候需要工具 AXMLPrinter2.jar 二、反编译环境要求 序号软件说明1java电脑得有java环境2AXMLPrinter2.jarapk中xml解析文件 三、反编译指令 java -jar AXMLPrinter2.jar "C:\Us…

腾讯百度阿里华为常见算法面试题TOP100(4):双指针、哈希、滑动窗口

之前总结过字节跳动TOP50算法面试题&#xff1a; 字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题 目录 双指针 42.接雨水 283.移动零 11.盛最多水的容器 15.三数之和 哈希 1. 两数之和 49.字母异位词分组 128.最长连续序列 滑动窗…

2024 RSTCONCTF re 部分wp

Unknown Architect DIE查看&#xff0c;RISC_V架构&#xff0c;直接交即可 Duke of the Kingdom 附件拖入jadx 比较简单。脚本 Keypad 附件拖入ida。一共四遍check&#xff0c;都比较简单 Pico-Cypher 文本编辑器打开附件 稍微问一问gpt&#xff0c;得知这是micropython&#x…