代码随想录算法训练营第四十九天| 42. 接雨水 、84.柱状图中最大的矩形

news2024/9/22 15:31:06

42. Trapping Rain Water

双指针暴力解法

每一列雨水的高度,取决于,该列 左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度,即: min(lHeight, rHeight) - height

class Solution:
    def trap(self, height):
        if len(height) <= 2:
            return 0

        max_left = [0] * len(height)
        max_right = [0] * len(height)
        n = len(height)

        # 记录每个柱子左边柱子最大高度
        max_left[0] = height[0]
        for i in range(1, n):
            max_left[i] = max(height[i], max_left[i - 1])

        # 记录每个柱子右边柱子最大高度
        max_right[n - 1] = height[n - 1]
        for i in range(n - 2, -1, -1):
            max_right[i] = max(height[i], max_right[i + 1])

        # 求和
        sum_ = 0
        for i in range(n):
            count = min(max_left[i], max_right[i]) - height[i]
            if count > 0:
                sum_ += count

        return sum_
        

单调栈解法:

一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。

遇到相同的元素,更新栈内下标,就是将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中,因为我们要求宽度的时候 如果遇到相同高度的柱子,需要使用最右边的柱子来计算宽度。

class Solution:
    def trap(self, height):
        result = 0
        stack = [0]
        for i in range(1, len(height)):
            while len(stack) > 0 and height[i] > height[stack[-1]]:
                mid_height = stack.pop()
                if stack:
                    h = min(height[i], height[stack[-1]]) - height[mid_height]
                    w = i - stack[-1] - 1
                    v = h*w
                    result += v
            stack.append(i)
        return result

84. Largest Rectangle in Histogram

只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。

所以本题单调栈的顺序正好与接雨水反过来。

此时大家应该可以发现其实就是栈顶和栈顶的下一个元素以及要入栈的三个元素组成了我们要求最大面积的高度和宽度

# 单调栈精简
class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        heights.insert(0, 0)
        heights.append(0)
        stack = [0]
        result = 0
        for i in range(1, len(heights)):
            while stack and heights[i] < heights[stack[-1]]:
                mid_height = heights[stack[-1]]
                stack.pop()
                if stack:
                    # area = width * height
                    area = (i - stack[-1] - 1) * mid_height
                    result = max(area, result)
            stack.append(i)
        return result

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

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

相关文章

华杉研发九学习日记23 多线程

华杉研发九学习日记23 java多线程 一&#xff0c; 线程 1.1 进程 进程就是一个程序运行的标志&#xff0c;是程序运行的状态。 一个正在运行的程序就是一个进程。进程是操作系统资源分配&#xff08;计算资源&#xff0c;比如CPU&#xff0c;存储:内存&#xff09;的最小单…

Day5

BootStrap 这个玩意可以理解为&#xff0c;已经写好的css样式的封装。 在开发中&#xff0c;如果需要用到这个&#xff0c; 首先得下载下来 找到官网&#xff0c;Bootstrap中文网 (bootcss.com) 这里我下载的是最新版的v5&#xff0c; 解压后&#xff0c;把该文件夹放进项目…

计算机三级嵌入式笔记(四)——嵌入式系统软件

目录 考点1 嵌入式软件的特点 考点2 嵌入式系统的软件结构 考点3 硬件抽象层与板级支持包 考点4 引导加载程序 考点5 嵌入式系统的设备驱动程序 考点6 实时系统与实时操作系统 考点7 嵌入式操作系统概述 考点8 Linux 内核 考点9 嵌入式 Linux 操作系统 考点10 Androi…

C语言自定义类型结构体与位段超详解

文章目录 1. 结构体类型的声明1. 1 结构体声明1. 2 结构体变量的创建和初始化1. 3 结构体的特殊声明1. 3 结构体的自引用 2. 结构体内存对齐2. 1 对齐规则2. 2 为什么存在内存对齐2. 3 修改默认对齐数 3. 结构体传参4. 结构体实现位段4. 1 什么是位段4. 2 位段成员的内存分配4.…

centos7 中安装 mysql 8.x以及对数据库的管理(数据库、表的增删改查、插入删除数据)

Day 16 centos7 中安装 mysql 8.x 1.下载安装包 [rootmysql~]#wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 2.解压 tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar [rootmysql ~]# ls anaconda-ks.cfg mys…

美业收银系统【客户管理】的重要作用|美业门店管理系统Java源码、系统演示

美业系统中的客户管理功能可以起到多种作用&#xff0c;包括但不限于以下几点&#xff1a; 1.客户档案管理&#xff1a; 记录客户的个人信息、偏好、消费记录等&#xff0c;便于了解客户需求&#xff0c;提供个性化的服务和推荐。 2.预约和排队管理&#xff1a; 帮助美业从…

探索Netty框架的核心构件

Netty是一个高性能、异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能、高可靠性的网络服务器和客户端程序。本文将深入探讨Netty框架的基本组件&#xff0c;帮助开发者更好地理解和使用这一强大的工具。 1. 事件循环&#xff08;EventLoop&#xff09;…

告别繁琐,AI助你轻松制作PPT!2024四大工具推荐

PPT是现代商务和教育领域中不可或缺的工具。然而&#xff0c;制作一份高质量的PPT往往需要花费大量的时间和精力。AI PPT制作工具的出现可以很好地解决这一问题。下面为大家推荐几个AI PPT制作工具。 笔灵AIPPT&#xff1a;智能设计&#xff0c;一键生成 链接&#xff1a;htt…

Stable Diffusion绘画 | 文生图设置详解(二)

提示词引导系统&#xff08;CFG Scale&#xff09; 这里的参数&#xff0c;是用来控制 SD 是否严格按照输入的提示词来生成画面 CFG值越小&#xff0c;对 SD 的约束程度就越低&#xff0c;AI 会加入更多想法&#x1f4a1;&#xff0c;CFG7是一个平衡值 CFG值越大&#xff0c;对…

STL——栈和队列和优先队列

栈和队列和优先队列 概述std&#xff1a;&#xff1a;堆栈核心函数和操作成员函数示例注意事项 std&#xff1a;&#xff1a;队列核心函数和操作成员函数示例注意事项 std&#xff1a;&#xff1a;优先队列底层实现原理效率分析deque双端队列原理块结构&#xff1a;指针管理&am…

【Pytorch】一文向您详细介绍 torch.sign()

&#x1f389;&#x1f9e0;**【Pytorch】一文向您详细介绍 torch.sign()** 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff…

Java高级

类变量/静态变量package com.study.static_; 通过static关键词声明,是该类所有对象共享的对象,任何一个该类的对象去访问他的时候,取到的都是相同的词,同样任何一个该类的对象去修改,所修改的也是同一个对象. 如何定义及访问? 遵循相关访问权限 访问修饰符 static 数据类型…

Day3

首先是模板语句的学习。 在学习之前&#xff0c;我们得搞清楚为什么要学它以及学它有什么用。 Django模板语句&#xff0c;使得网页内容可以动态地从数据库中加载&#xff0c;而不是静态地写在HTML文件中。这样&#xff0c;当你需要更新网站信息时&#xff0c;只需更改模板或…

【Spark计算引擎----第二篇(RDD):一篇文章带你清楚什么是RDD?RDD的概念,RDD的特性,怎么创建一个RDD,RDD的算子】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本阶段和大家一起分享和探索大数据技术Spark—RDD&#xff0c;本篇文章主要讲述了&#xff1a;RDD的概念&#xff0c;RDD的特性&#xff0c;怎么创建一个RDD&#xff0c;RDD的算子等等。欢…

第三十一天 chrome调试工具

打开调试工具 页面空白处右击 检查 或者F12 使用调试工具 ctrl滚轮改变代码大小 左边是html 右边是css css可以直接改动数值左右箭头或者直接输入 查看颜色 ctrl0 复原浏览器大小 点击元素右侧出现样式引入 没有的话 说明类名或者样式引用错误 这里的.new-left是存在的 如果类…

OpenStack;异构算力网络架构;算力服务与交易技术;服务编排与调度技术

目录 OpenStack 一、OpenStack概述 二、OpenStack的主要组件及功能 三、OpenStack的架构 四、OpenStack的应用场景 异构算力网络架构 算力服务与交易技术 服务编排与调度技术 OpenStack 是一个开源的云计算管理平台项目,由NASA(美国国家航空航天局)和Rackspace合作…

数学建模评价类模型—层次分析法(无数据情况下)

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 本文将讲解解决评价类问题的第一种模型层次分析法&#xff08;AHP法&#xff09;&#xff0c;首先我们会具体讲解评价类问题解答的具体流程再对AHP方法进行讲解 一、评价类问题概述 评价…

DB管理客户端navicat、DBever、DbVisualizer数据库连接信息迁移

DB管理客户端Navicat、DBever、DbVisualizer数据库连接信息迁移 第三方数据库连接工具为了确保数据库信息安全通常对保存的数据库连接密码进行加密&#xff0c;填入后想再拿到原文就不可能了&#xff0c;有时交接给别人或者换电脑时可以通过连接数据导出的方式来解决。 Navic…

echarts 极坐标柱状图 如何定义柱子颜色

目录 echarts 极坐标柱状图 如何定义柱子颜色问题描述方式一 在 series 数组中定义颜色方式二 通过 colorBy 和 color 属性配合使用 echarts 极坐标柱状图 如何定义柱子颜色 本文将分享在使用 echarts 的 极坐标柱状图 时&#xff0c;如何自定义柱子的颜色。问题本身并不难解决…

URL中的中文编码与解码

URL在传输时只能使用ACSII码表示&#xff0c;且ASCII码只有128位&#xff0c;无法存储汉字等字符&#xff0c;因此对于这些非ASCII码字符需要进行编码处理&#xff0c;以保证URL的完整性 Python中urllib.parse模块提供了两个方法quote和unquote可用于URL中的中文编码与解码 以…