首页 > 其他分享 >第十章 单调栈 Part2

第十章 单调栈 Part2

时间:2024-09-03 12:02:53浏览次数:3  
标签:right 第十章 len height Part2 result heights stack 单调

目录

任务

42. 接雨水

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

思路

按照横向计算,单调栈的思路得到 left和right,然后得到h 和 w,最终累加结果。

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

84. 柱状图中最大的矩形

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

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

思路

对于某根柱子,找到左边第一个比它小的和右边第一个比它小的,中间的部分即是当前柱子能够构成的最大面积。需要注意在数组左右两边添加0来保证首尾柱子的正确计算(或者理解为当特殊情况比如数组单调递增或单调递减时的正确处理)

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        stack = []
        result = 0
        
        # 头部尾部加0 
        heights.insert(0,0)
        heights.append(0)
        
        for i in range(len(heights)):
            if len(stack) > 0 and heights[i] >= heights[stack[-1]]:
                stack.append(i)
            else:
                while len(stack) > 0 and heights[i] < heights[stack[-1]]:
                    mid = stack[-1]
                    stack.pop()
                    if len(stack) > 0:
                        left = stack[-1]
                        right = i
                        
                        result = max(result,heights[mid] * (right - left -1)) 
                stack.append(i)
        return result

标签:right,第十章,len,height,Part2,result,heights,stack,单调
From: https://www.cnblogs.com/haohaoscnblogs/p/18394288

相关文章

  • 计算机三级 - 数据库技术 - 第十章 数据库运行维护与优化 笔记
    第十章数据库运行维护与优化 内容提要:了解数据库运行维护的基本原理了解运行状态监控与分析了解数据库存储空间管理掌握数据库性能优化的方法10.1数据库运行维护基本工作DBAS进入运行维护阶段的主要任务:保证数据库系统安全、可靠且高效地运行维护工作包括:数......
  • 《NET CLR via C#》---第十章(无参属性,对象和集合初始化器,匿名类型,元组,有参属性)
    面向对象设计和编程的重要原则之一就是数据封装,意味着类型的字段永远不应该公开,否则很容易因为不恰当使用字段而破坏对象的状态。无参属性对于类型中数据字段的封装,有以下3点好处:可能希望访问字段来执行一些“副作用”,缓存某些值或者推迟创建一些内部对象可能希望以线程安全......
  • 第十章 单调栈 Part1
    目录任务739.每日温度思路496.下一个更大元素I思路503.下一个更大元素II思路任务739.每日温度给定一个整数数组temperatures,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0......
  • Study Plan For Algorithms - Part20
    1.树的子结构输入两棵二叉树A和B,判断B是不是A的子结构。方法一:classTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightdefisSubStructure(A,B):ifnotAornot......
  • 单调栈
    单调栈经典用法:在数组中当前元素的两侧找第一个比当前元素更大(更小)的数在哪维持求解答案的可能性单调栈里的所有对象按照规定好的单调性来组织当某个对象进入单调栈时,会从栈顶开始依次淘汰单调栈里对后续求解答案没有帮助的对象每个对象从栈顶弹出时结算当前对象参......
  • 738. 单调递增的数字(leetcode)
    https://leetcode.cn/problems/monotone-increasing-digits/description/classSolution{publicintmonotoneIncreasingDigits(intn){//返回单调递增的最大数字//思路比较巧妙的贪心题,需要仔细考虑两个相邻位之间的比较//一旦发现有前一......
  • 单调队列--滑动窗口最大值(leetcode23)
    目录一、单调队列介绍二、题目应用1.题目描述2.解题碎碎念3.代码示例三、扩展1.与优先队列区别2.单调队列其他题目一、单调队列介绍单调队列是一种特殊的队列数据结构,它能够在常数时间内找到队列中的最值。单调队列可以用来解决一些与最值相关的问题,例如滑动窗口最......
  • P5788 【模板】单调栈
    P5788【模板】单调栈传送门题目描述给出项数为\(n\)的整数数列\(a_{1\dotsn}\)。定义函数\(f(i)\)代表数列中第\(i\)个元素之后第一个大于\(a_i\)的元素的下标,即\(f(i)=\min_{i<j\leqn,a_j>a_i}\{j\}\)。若不存在,则\(f(i)=0\)。试求出\(f(1\dotsn)\)。......
  • 数据结构和算法学习日志-第十章:树
    第十章树思维导图:1.树的定义和树的存储结构1.1树的定义1.1.1定义树(Tree)是n(n>=0)个节点的有限集。当n=0时称为空树。在任意一棵非空树中:有且仅有一个特定的被称为根(Root)的节点当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1、T2、……、Tm,其中每个集合本身又是一棵树,并......
  • 线段树维护单调栈——区间查询版本 & 维护递减序列
    这次算是完全搞懂了吧()()(#include<bits/stdc++.h>#defineraedread#definecaclcalc#definepbpush_back#definepiipair<int,int>#defineintlonglong#definefifirst#definesesecond#definelsp<<1#definersp<<1|1usingn......