Python题解Leetcode Hot 100之栈和堆

1. 有效的括号

  • 题目描述
    给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合,左括号必须以正确的顺序闭合。
  • 解题思路
    使用栈来匹配括号。遇到左括号时,将其压入栈中;遇到右括号时,检查栈顶元素是否为对应的左括号,如果是则弹出栈顶元素,否则返回无效。最后在判断该栈是否为空;
  • 代码
    class Solution:def isValid(self, s: str) -> bool:n = len(s)if n == 0:return Truedic = {')':'(', ']':'[', '}':'{'}sta = []for c in s:if c not in dic:sta.append(c)else:if len(sta) != 0 and sta[-1] == dic[c]:sta.pop()else:return Falsereturn True if len(sta) == 0 else False
    

2. 最小栈

  • 题目描述
    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类。
  • 解题思路
    ==使用两个栈,一个栈存储所有元素,另一个栈存储每个状态下的最小元素。==每次入栈时,如果当前元素和最小栈顶元素的最小值压入最小栈;出栈时,两个栈同时出栈。
  • 代码
    class MinStack:def __init__(self,):self.s = []self.min_values = []def pop(self):self.s.pop()self.min_values.pop()def push(self, x):if len(self.s) == 0:self.s.append(x)self.min_values.append(x)else:self.s.append(x)cur_min = min(self.min_values[-1], x)self.min_values.append(cur_min)def top(self):return self.s[-1]def getMin(self):return self.min_values[-1]

3. 字符串解码

  • 题目描述
    给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。

  • 解题思路
    使用栈来处理嵌套的括号和重复次数。遍历字符串,分别将字符压入到栈中,当遇到’]‘时将’[‘和’]'之间的字符弹出,然后继续弹出数字,将此部分解码后压入到栈中,然后接着遍历;

  • 代码

    class Solution:def decodeString(self, s: str) -> str:# num_char = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']sta = []for c in s:if c != ']':# 如果不是右括号,直接压入sta.append(c)else:cur_s = []while True:# 将左右括号之间的字符弹出if sta[-1] != '[':cur_s.append(sta.pop())else:sta.pop()breaknums = []# 弹出数字while len(sta) != 0 and sta[-1] >= '0' and sta[-1] <= '9':nums.append(sta.pop())num = int("".join(nums[::-1]))cur = "".join(cur_s[::-1])cur = cur * numsta.append(cur)return "".join(sta)
    

4. 每日温度

  • 题目描述
    请根据每日气温列表,重新生成一个列表,要求其对应位置的输出是:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

  • 解题思路
    单调栈就是用来求取第一个比当前元素大或者小的元素,很明显这个题目就是这样。 使用单调栈来存储气温列表的索引,遍历气温列表,栈内存储未找到更高气温的索引,当遇到更高气温时,计算等待天数并更新结果列表。注意单调栈一般保存的是索引下标,这样方便更新每个位置的答案。

    关于单调栈:

    • 使用场景
      什么时候使用单调栈:通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了,时间复杂度是O(n);

    • 定义

      单调栈 = 使用栈这个数据结构 + 压入弹出的规则由当前遍历到的元素和栈顶的元素的大小关系决定;

    • 为什么叫做单调栈

      如果是寻找右边第一个比自己大的元素,那么从栈顶到栈底是单调递增的;如果是寻找右边第一个比自己小的元素,那么从栈顶到栈底是单调递减的;

    • 压入弹出的规则(以寻找右边第一个比自己大的元素为例)

      1. 当前元素大于栈顶元素,那么说明此时发现了栈顶元素的右边第一个比其大的元素,那么将当前元素保存到对应的结果上,同时将栈顶元素弹出,继续比较直至当前元素小于栈顶元素,将当前元素压入;
      2. 当前元素小于等于栈顶元素时,将当前元素直接压入
  • 代码

    class Solution:def dailyTemperatures(self, temperatures: List[int]) -> List[int]:n = len(temperatures)res = [0] * ns = [0]for i in range(1, n):while len(s)!=0 and temperatures[i] > temperatures[s[-1]]:res[s[-1]] = i - s[-1]s.pop()s.append(i)return res
    

5. 柱状图中最大的矩形

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

  • 解题思路
    可以枚举以每个柱形为高度的最大矩形的面积。每个柱子向左向右分别查找第一个比他们矮的柱子,这两个柱子就是他们的左右边界。很明显左右边界可以用单调栈来查找;

  • 代码

class Solution:def largestRectangleArea(self, heights: List[int]) -> int:n = len(heights)left = [0] * nright = [0] * ns = []for i in range(n):if len(s) == 0 or heights[s[-1]] <= heights[i]:s.append(i)else:while len(s) != 0 and heights[s[-1]] > heights[i]:right[s[-1]] = i - 1 - s[-1]s.pop()s.append(i)s = []for i in range(n - 1, -1, -1):if len(s) == 0 or heights[s[-1]] <= heights[i]:s.append(i)else:while len(s) != 0 and heights[s[-1]] > heights[i]:left[s[-1]] = s[-1] - i - 1s.pop()s.append(i)res = 0for i in range(n):res = max(res, (left[i] + right[i] + 1) * heights[i])return res

  • 定义
    堆(heap)是一种满足特定条件的完全二叉树,主要可分为两种类型

  • 小顶堆(min heap):任意节点的值小于等于其子节点的值,根节点的值是堆中最小的。

  • 大顶堆(max heap):任意节点的值大于等于其子节点的值,根节点的值是堆中最大的。

  • python中的堆

  • heapq:是最小堆

    import heapq
    pri_que = []
    heapq.heappush(pri_que, value)
    heapq.heappop(pri_que)
    

pri_que[0]是堆中的最小值

6. 数组中的第K个最大元素

  • 题目描述
    在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
  • 解题思路
    使用最小堆来维护前 k 个最大的元素,遍历数组时,如果当前元素大于堆顶元素,则替换堆顶元素并调整堆。最终堆顶元素即为第 k 个最大元素。
  • 代码
    import heapq
    class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:heap = []n = len(nums)for i in range(n):if i < k:heapq.heappush(heap, nums[i])else:if nums[i] > heap[0]:heapq.heappop(heap)heapq.heappush(heap, nums[i])return heap[0]
    

7. 前 K 个高频元素

  • 题目描述
    给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
  • 解题思路
    使用哈希表统计每个元素的频率,然后使用最小堆来维护频率前 k 高的元素。遍历哈希表时,如果当前元素频率大于堆顶元素,则替换堆顶元素并调整堆。这里有一个技巧,就是可以将频率和数组组成一个元组作为堆中存储的基本元素,因此元组也是可以排序的,这样的话就解决了多个数字对应相同频率的情况
  • 代码
    class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:dic = dict()for num in nums:dic[num] = dic.get(num, 0) + 1 pri_que = []for key, value in dic.items():heapq.heappush(pri_que, (value, key))if len(pri_que) > k:heapq.heappop(pri_que)res = []for i in range(k):res.append(pri_que[i][1])return res
    

8. 数据流的中位数

  • 题目描述
    中位数是排序后数组的中间值。如果数组长度是偶数,中位数是中间两个数的平均值。设计一个支持以下两种操作的数据结构:addNum(num):从数据流中添加一个整数到数据结构中。findMedian():返回目前所有元素的中位数。

  • 解题思路
    使用两个堆,一个最大堆存储较小的一半元素,一个最小堆存储较大的一半元素。添加元素时,根据元素大小分别插入对应的堆,并调整堆大小平衡,即两个堆中元素的数量差距不能大于1。中位数为两个堆顶元素的平均值或元素多的那个堆的堆顶元素。注意python中的heapq是最小堆,如果想实现最大堆,得把元素取反后压入
    时间复杂度:

      addNum: O(logn),其中 n 为累计添加的数的数量。findMedian: O(1)。
    

    空间复杂度:O(n),主要为堆的开销。

  • 代码

    import heapq
    class MedianFinder:def __init__(self):self.l = []self.r = []def addNum(self, x):if len(self.l) == 0 and len(self.r) == 0:heapq.heappush(self.l, -x)elif x < -self.l[0]:heapq.heappush(self.l, -x)if len(self.l) - len(self.r) > 1:temp = -heapq.heappop(self.l)heapq.heappush(self.r, temp)else:heapq.heappush(self.r, x)if len(self.r) - len(self.l) > 1:temp = heapq.heappop(self.r)heapq.heappush(self.l, -temp)def findMedian(self):l_n = len(self.l)r_n = len(self.r)if l_n > r_n:return -self.l[0]elif l_n == r_n:return (-self.l[0] + self.r[0]) / 2.0else:return self.r[0]

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

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

相关文章

【Lua】元表使用示例

在Lua中&#xff0c;元表(metatable)是一种强大的机制&#xff0c;允许你改变表的行为。通过元表&#xff0c;你可以控制表的操作&#xff0c;比如访问、赋值、运算等。元表提供了一个灵活的方法来重载或扩展Lua的内建行为。 1. 元表的基本概念 元表本质上是一个表&#xff0…

gitee及git的简单使用、下载教(保姆级教程)

前言&#xff1a; GitHub&#xff0c;一个由外国研发的代码开源网站&#xff0c;我们可以通过它获得别人优秀的项目源码&#xff0c;也可以在上面上传自己的劳动成果。但是&#xff0c;我们很难访问外网。于是&#xff0c;我们将目光转向国内一个类似的网站---码云&#xff08…

静态路由配置注意事项及黑洞路由的使用

静态路由 1 . 定义 从管理员处学习到的数据转发路径&#xff0c;就称为静态路由。 2 . 路由表 Proto &#xff1a;协议&#xff08; Protocol &#xff09; Direct — 直连链路Static — 静态路由RIP 、OSPF 等 — 动态路由 Pre : 优先级&#xff08; Preference &#x…

设计模式之职责链模式(Chain of Responsibility Pattern)

1.概念 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;&#xff1a;避免将请求发送者与接收者耦合在一起&#xff0c;让多个对象都有机会接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止…

搞清楚[继承],易如反掌

穷不失义&#xff0c;达不离道。——孔丘《论语》 继承 1、简单理解2、继承2、1、继承的概念2、2、继承定义2、3、基类和派生类对象赋值转换2、4、继承中的作用域2、5、派生类默认成员函数2、6、继承中的特点2、6、1、友元2、6、2、静态成员2、6、3、菱形继承及菱形虚拟继承 3、…

大数据平台权限之ACL

在 Hadoop 3 中&#xff0c;访问控制列表 (ACL) 是一种权限管理机制&#xff0c;用于更细粒度地控制用户对 HDFS&#xff08;Hadoop Distributed File System&#xff09;文件和目录的访问权限。ACL 允许你为文件和目录指定传统 Unix 权限模型之外的用户和组权限。 以下是 Had…

html H5 dialog弹窗学习,实现弹窗显示内容 替代confirm、alert

html H5 dialog弹窗学习,实现弹窗内容 替代confirm 框架使用的mui,使用mui.confirm() 弹窗内容过多时,弹窗被撑的到屏幕外去了,使用H5 dialog 标签自定义一个固定大小的弹窗,内容过多时可下拉显示 效果展示 隐私政策内容很多,可以下拉显示 代码 myDialog.css dialog{p…

【Linux】【开发】Linux内核及用户态程序异常问题的查证方法

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;Linux技术&…

crontab定时任务不执行原因排查

Crontab定时任务不执行可能有多种原因。以下是一些常见的问题和相应的排查方法&#xff1a; 任务格式错误&#xff1a; 检查crontab文件中的每条任务是否格式正确。尤其是要检查有没有特殊字符&#xff0c;我用 crontab contab.txt导入任务&#xff0c;结果crontab -l显示 *…

PCL 点云最小外接球形包围盒

一、代码示例 #include <iostream> #include <vector> #include <cmath> #include <pcl/point_types.h> #include <pcl/io/p

【深度学习基础】MacOS PyCharm连接远程服务器

目录 一、需求描述二、建立与服务器的远程连接1. 新版Pycharm的界面有什么不同&#xff1f;2. 创建远程连接3. 建立本地项目与远程服务器项目之间的路径映射4.设置保存自动上传文件 三、设置解释器总结 写在前面&#xff0c;本人用的是Macbook Pro&#xff0c; M3 MAX处理器&am…

PointNet——源码调试(模型训练+可视化测试显示)

因为项目涉及到3D点云项目&#xff0c;故学习下PointNet这个用来处理点云的神经网络 论文的话&#xff0c;大致都看了下&#xff0c;网络结构有了一定的了解&#xff0c;本博文主要为了下载调试PointNet网络源码&#xff0c;训练和测试调通而已。 我是在Anaconda下创建一个新的…

【C++知识点总结全系列 (08)】:面向对象编程OOP

这里写目录标题 1、OOP概述(1)面向对象四大特征A.抽象B.封装C.继承D.多态 (2)构造函数A.What&#xff08;什么是构造函数&#xff09;B.Why&#xff08;构造函数的作用&#xff09;C. Which&#xff08;有哪些构造函数&#xff09; (3)析构函数A.What&#xff08;什么是析构函数…

【YOLOv8系列】(一)YOLOv8介绍:实时目标检测的最新突破

目录 引言 背景与发展历程 YOLOv8架构设计 1. 改进的特征提取网络 2. 多尺度特征融合 3. 新的激活函数 4. Attention机制 模型训练与优化 性能评估 应用案例 目标检测 图像分割 图像分类 姿势估计 旋转框检测&#xff08;OBB&#xff09; 优势与挑战 优势&…

git 基础场景操作

git基于当前分支创建分支&#xff0c;合并分支 git checkout -b new-batch git push origin new-batch git branch --set-upstream-toorigin/new-batch git pull git checkout master git merge origin new-batch git 开发分支合并 描述&#xff1a; git 我有 develop …

SAP PS学习笔记03 - 批量更改Project(CNMASS),批量创建Project(CNMASSCREATE)

上一章讲了网络&#xff08;Network&#xff09;&#xff0c;活动&#xff08;Activity&#xff09;&#xff0c;PS长文本&#xff0c; PS文书&#xff08;凭证&#xff09;&#xff0c;里程碑&#xff08;Milestone&#xff09;的创建等相关知识。 SAP PS学习笔记02 - 网络&a…

中西部公关新篇章:赛氪网赋能新质生产力赛事,引领行业潮流

2024年7月7日&#xff0c;武汉光谷盛况空前&#xff0c;中西部公共关系协会共同体多边合作平台&#xff08;以下简称“共同体”&#xff09;举办了2024年度中西部公关协会会长、秘书长专题交流会&#xff0c;本次会议主题为“加快新质生产力&#xff0c;推进公关行业新格局&…

C++17 filesystem 库 学习笔记

C17 filesystem 库 学习笔记 Filesystem library1、类2、非成员函数2.1、std::filesystem::absolute2.2、std::filesystem::canonical, std::filesystem::weakly_canonical2.3、std::filesystem::relative, std::filesystem::proximate2.4、std::filesystem::copy2.5、std::fil…

思维+数学,CF 1138B - Circus

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1138B - Circus 二、解题报告 1、思路分析 设第一组会小丑和杂技的人数分别为x1, y1 第二组会小丑和杂技的人数分别为x2, y2 显然根据要求有&#xff1a; x1 y2 > x1 x2 x2 y2 上式说明第二组每…

213.贪心算法:跳跃游戏||(力扣)

class Solution { public:int jump(vector<int>& nums) {if (nums.size() 1) return 0; // 如果数组长度为1&#xff0c;已经在终点&#xff0c;不需要跳跃int cur 0; // 当前跳跃能到达的最远位置int flag 0; // 记录跳跃次数int next 0; // 下一次跳跃能到…