首页 > 编程语言 >代码随想录算法训练营Day60 | 84.柱状图中最大的矩形 | Python | 个人记录向

代码随想录算法训练营Day60 | 84.柱状图中最大的矩形 | Python | 个人记录向

时间:2024-06-04 10:31:24浏览次数:30  
标签:柱子 Python 栈顶 随想录 heights 柱状图 stack 84

注:今天是代码随想录训练营的最后一天啦!!!

本文目录

84.柱状图中最大的矩形

代码随想录:84.柱状图中最大的矩形
Leetcode:84.柱状图中最大的矩形

做题

无思路。

看文章

与 42. 接雨水 很像,42. 接雨水 是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子

举例说明求解:[2, 1, 5, 6, 2, 3]。以1为基准,左右都没有比1小的,所以1可以向左右拓展到底,即高为1、宽为6。以5为基准,左边1<5,右边2<5,所以5可以向左拓展到1(开区间),向右拓展到2(开区间),即高为5、宽为2。

在此基础上结合单调栈,具体可看视频。

# 单调栈
class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        # Monotonic Stack
        '''
        找每个柱子左右侧的第一个高度值小于该柱子的柱子
        单调栈:栈顶到栈底:从大到小(每插入一个新的小数值时,都要弹出先前的大数值)
        栈顶,栈顶的下一个元素,即将入栈的元素:这三个元素组成了最大面积的高度和宽度
        情况一:当前遍历的元素heights[i]大于栈顶元素的情况
        情况二:当前遍历的元素heights[i]等于栈顶元素的情况
        情况三:当前遍历的元素heights[i]小于栈顶元素的情况
        '''

        # 输入数组首尾各补上一个0(与42.接雨水不同的是,本题原首尾的两个柱子可以作为核心柱进行最大面积尝试
        heights.insert(0, 0)
        heights.append(0)
        stack = [0]
        result = 0
        for i in range(1, len(heights)):
            # 情况一
            if heights[i] > heights[stack[-1]]:
                stack.append(i)
            # 情况二
            elif heights[i] == heights[stack[-1]]:
                stack.pop()
                stack.append(i)
            # 情况三
            else:
                # 抛出所有较高的柱子
                while stack and heights[i] < heights[stack[-1]]:
                    # 栈顶就是中间的柱子,主心骨
                    mid_index = stack[-1]
                    stack.pop()
                    if stack:
                        left_index = stack[-1]
                        right_index = i
                        width = right_index - left_index - 1
                        height = heights[mid_index]
                        result = max(result, width * height)
                stack.append(i)
        return result

时间复杂度: O(n)
空间复杂度: O(n)

以往忽略的知识点小结

  • 单调栈的思路还是不熟

个人体会

完成时间:1h30min。
心得:84.柱状图中最大的矩形 与 42.接雨水 思路差不多,但为什么怎么做,还需要多琢磨琢磨。很感叹的是,算法训练营今天就结营了,感觉时间飞快。

标签:柱子,Python,栈顶,随想录,heights,柱状图,stack,84
From: https://blog.csdn.net/Xiu_Yuan123/article/details/139425791

相关文章

  • 【转载】python画带方差的折线图(csdn上最简洁的代码之一附上)
    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/a1920993165/article/details/122277716python画带方差的折线图画好后效果图(直接一个图的)实现代码如下点击查看代码importnumpyasnpimport......
  • Zemax and Python联用
    透镜面的厚度与材料单透镜:两个面组成,第一个面赋予材料和厚度——即该透镜的材料和厚度;第二个面不需要赋予材料,其厚度为下一个透镜的空气间隔——即下一个物体的起始点以此厚度末端为原点胶合透镜:三个面组成,第一个面和第二个面赋予材料和厚度——即该胶合透镜第一个和第二个的......
  • ### Python 字典操作详解:从创建、增删改查到高级技巧全解析
    1.创建字典使用大括号{}创建空字典empty_dict={}print(empty_dict)#输出:{}使用dict函数创建字典#通过键值对创建字典person=dict(name="Alice",age=30,city="NewYork")print(person)#输出:{'name':'Alice','age':30,'c......
  • ### Python 列表操作详解:从创建、增删到高级技巧全覆盖
    1.创建列表使用list函数创建空列表:empty_list=list()print(empty_list)#输出:[]从字符串创建列表:string="hello"list_from_string=list(string)print(list_from_string)#输出:['h','e','l','l','o']......
  • python常用语法
    Python是一种非常流行的编程语言,因其简洁和易读性而备受欢迎。以下是一些Python的常用语法,涵盖基本语法、数据类型、控制流、函数、类和模块等内容。1.基本语法1.1打印输出print("Hello,world!")1.2变量赋值x=10y=20name="Alice"2.数据类型2.1数字inte......
  • python代码备忘录
    从斐波那契的递归实现到通用递归函数的实现deffibonacci(_target): if_target==0: return1 else returnfibonacci(_target-1)+fibonacci(_target-2) pass fibonacci(10)从上述算法中我们知道,每进入一层递归,递归函数都会在调用自己两次。故此方法实现的......
  • 【用Python画画】画奥运五环
    本文收录于《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢!文章目录一、前言二、代码示例三、知识点梳理四、总结一、前言本文介绍如何使用Python的海龟画图工具turtle,画奥运五环标志。什么是Python?Python是由荷兰人吉多·范罗......
  • python3 源码阅读-虚拟机运行原理
    原文阅读源码版本python3.8.3参考书籍<<Python源码剖析>>参考书籍<<Python学习手册第4版>>官网文档目录介绍Doc目录主要是官方文档的说明。Include:目录主要包括了Python的运行的头文件。Lib:目录主要包括了用Python实现的标准库。Modules:该目录中包含了所有用C......
  • 代码随想录算法训练营第27天 | 39. 组合总和 、 40.组合总和II 、 131.分割回文串
    组合总和本题是集合里元素可以用无数次,那么和组合问题的差别其实仅在于startIndex上的控制题目链接/文章讲解:https://programmercarl.com/0039.组合总和.html视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ/***@param{number[]}candidates*@param{number......
  • 【Python】使用 Python 查询域名的 IP 地址
    我们都已经长大好多梦正在飞就像童年看到的红色的蜻蜓我们都已经长大好多梦还要飞就像现在心目中红色的蜻蜓                     ......