【力扣hot100】刷题笔记Day21

news2024/9/22 7:41:37

前言

  • 快乐周日,做了个美梦睡了个懒觉,组会前刷刷栈的题吧

20. 有效的括号 - 力扣(LeetCode)

  • 辅助栈

    • class Solution:
          def isValid(self, s: str) -> bool:
              dic = {')':'(',']':'[','}':'{'}
              st = []
              for c in s:
                  if st and c in dic:
                      if dic[c] == st[-1]:  
                          st.pop()     # 和栈顶能匹配上就弹出
                      else:
                          return False # 匹配不上就返回False
                  else:
                      st.append(c)
              return not st  # 空的话return True,不空有多余字符return False

 155. 最小栈 - 力扣(LeetCode)

  • 辅助栈

    • class MinStack:
          # 双栈:正常栈和最小栈,后者有更新才存入
          def __init__(self):
              self.stack = []
              self.min_stack = []
      
          # 最小栈为空或者有更小值才压入
          def push(self, val: int) -> None:
              self.stack.append(val)
              if not self.min_stack or val <= self.min_stack[-1]:
                  self.min_stack.append(val)
      
          # 把之前一起压入的最小值也弹出
          def pop(self) -> None:
              pop_x = self.stack.pop()
              if pop_x == self.min_stack[-1]:  
                  self.min_stack.pop()    # 说明是当时一起压入的
      
          # 正常栈
          def top(self) -> int:
              return self.stack[-1]
      
          # 最小栈
          def getMin(self) -> int:
              return self.min_stack[-1]
  • 存元组

    • class MinStack:
          # 直接用一个栈存元组(栈顶,当前栈的最小值)
          def __init__(self):
              self.stack = []
      
          # 空直接存,非空就更新最小值
          def push(self, val: int) -> None:
              if not self.stack:
                  self.stack.append((val,val))
              else:
                  self.stack.append((val, min(val, self.stack[-1][1])))
      
          # 弹出元组
          def pop(self) -> None:
              self.stack.pop()
      
          # 返回栈顶
          def top(self) -> int:
              return self.stack[-1][0]
      
          # 返回最小值
          def getMin(self) -> int:
              return self.stack[-1][1]

394. 字符串解码 - 力扣(LeetCode)

  • 辅助栈

    • 思路参考K神题解
    • class Solution:
          def decodeString(self, s: str) -> str:
              st, res, num =[], '', 0
              for c in s:
                  if c.isdigit():
                      num = num * 10 + int(c)  # 为了获得连续数字比如"100"→100
                  elif c == '[':
                      st.append((num, res))   # num表示倍数,res表示前缀
                      res, num = '', 0        # 更新倍数和括号里的字符
                  elif c == ']':
                      now_num, now_res = st.pop()
                      res = now_res + now_num * res  # 新前缀 = 旧前缀 + 倍数 × 括号里的字符
                  else:
                      res += c  # 括号里的字符增加 / 无括号则一直增加
              return res
  •  递归法

    • class Solution:
          def decodeString(self, s: str) -> str:
              def dfs(s, i):
                  res, num = '', 0
                  while i < len(s):
                      if s[i].isdigit():
                          num = num * 10 + int(s[i])  # 为了获得连续数字比如"100"→100
                      elif s[i] == '[':
                          i, now_res = dfs(s, i+1)  # 从下一层中获取括号内的res和新的下标
                          res += num * now_res      # 加入结果集
                          num = 0                   # 更新倍数
                      elif s[i] == ']':
                          return i, res             # 将当前的坐标和结果返回上一层
                      else:
                          res += s[i]               # 更新总结果集/更新括号里的字符
                      i += 1                        # 坐标到达最后退出循环
                  return res
              return dfs(s, 0)

739. 每日温度 - 力扣(LeetCode)

  • 单调栈

    • class Solution:
          def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
              n = len(temperatures)
              st = [0]            # 单调递减栈
              res = [0] * n     
              for i in range(n):
                  # 如果栈顶有数且当前数大于栈顶,记录栈顶的结果,pop
                  while st and temperatures[i] > temperatures[st[-1]]:
                      res[st[-1]] = i - st[-1]
                      st.pop()
                  # 栈为空 或 当前数小于等于栈顶,push
                  st.append(i)
              return res

 84. 柱状图中最大的矩形 - 力扣(LeetCode)

  • 前后缀dp

    • class Solution:
          def largestRectangleArea(self, heights: List[int]) -> int:
              n = len(heights)
              left_i = [0] * n  # dp求左边第一个比当前小的数的下标
              right_i = [0] * n  # dp求右边第一个比当前小的数的下标
              left_i[0] = -1     # 初始化为-1
              right_i[n-1] = n   # 初始化为n
              for i in range(1, n):  # 从前往后,如果前一个数不比当前小,则找前一个数的left_i
                  last = i - 1
                  while last >= 0 and heights[last] >= heights[i]:
                      last = left_i[last]
                  left_i[i] = last
              for i in range(n-2, -1, -1):
                  last = i + 1       # 从后往前,如果后一个数不比当前小,则找后一个数的right_i
                  while last <= n - 1 and heights[last] >= heights[i]:
                      last = right_i[last]
                  right_i[i] = last
              res = 0  # (当前值) * (右边第一小i - 左边第一小i - i)
              for i in range(n):
                  res = max(res, heights[i] * (right_i[i] - left_i[i] - 1))
              return res
  • 单调栈

    • class Solution:
          def largestRectangleArea(self, heights: List[int]) -> int:
              stack = []  # 单调递增栈
              heights = [0] + heights + [0]  # 前后补0
              res = 0
              for i in range(len(heights)):
                  while stack and heights[i] < heights[stack[-1]]:
                      # stack[-1]是mid,i为右边第一个比它小的数,stack[-2]是左边第一个比它小的数
                      mid = stack.pop()
                      left = stack[-1]
                      res = max(res, (i - left - 1) * heights[mid])
                  stack.append(i)
              return res

 42. 接雨水 - 力扣(LeetCode)

  • 相向双指针

    • 最简洁做法,在之前【力扣hot100】刷题笔记Day3-CSDN博客记录过了,本篇记录另外前后缀dp和单调栈的做法
  • 前后缀dp

    • class Solution:
          def trap(self, height: List[int]) -> int:
              n = len(height)
              leftMax = [0] * n   # 左边最高柱(包括当前)
              leftMax[0] = height[0]  # 初始化为最左柱
              rightMax = [0] * n  # 右边最高柱(包括当前)
              rightMax[n-1] = height[-1]  # 初始化为最右柱
              for i in range(1, n):
                  leftMax[i] = max(height[i], leftMax[i-1])
              for i in range(n-2, -1, -1):
                  rightMax[i] = max(height[i], rightMax[i+1])
              res = 0
              for i in range(n):
                  # 竖着算:每格雨水 = 左右最小的最高柱 - 当前高度
                  res += min(leftMax[i], rightMax[i]) - height[i]
              return res
  • 单调栈

    •  
    • class Solution:
          def trap(self, height: List[int]) -> int:
              st, res = [], 0   # 单调递减栈
              for i in range(len(height)):
                  while st and height[i] >= height[st[-1]]:  # >=重复元素处理后替换栈顶
                      mid = st.pop()  # 凹槽
                      if not st:  # 特殊处理两个元素的情况
                          break
                      left = st[-1]  # st[-1]左边,i为右边
                      h = min(height[i], height[left]) - height[mid]  # 雨水的高
                      res += h * (i - left - 1)  # 横着算
                  st.append(i)  # 栈为空或者满足递减值
              return res

后言

  •  过完愉快周末又是新一周了,把周末没搞完的栈弄完了,学单调栈感觉脑子好痒哦

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

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

相关文章

JavaScript实现鼠标移动特效

关键代码&#xff1a; <script>document.onmousemove function (e) {// 加div节点var div document.createElement(div);div.style.width 5px;div.style.height 5px;// 加img节点var img document.createElement(img);// 将Img追加到div里面。div.appendChild(img);…

LeetCode 刷题 [C++] 第763题.划分字母区间

题目描述 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 …

聊一聊日常开发中如何优雅的避免那无处不在的空指针异常

在Java编程语言中&#xff0c;NullPointerException&#xff08;简称NPE&#xff09;是一种常见的运行时异常&#xff0c;当程序试图访问或操作一个还未初始化&#xff08;即值为null&#xff09;的对象引用时&#xff0c;Java虚拟机就会抛出NullPointerException。如果我们在日…

GO 的 Web 开发系列(六)—— 遍历路径下的文件

文件 IO 处理是程序的基础功能&#xff0c;WEB 程序中通过文件 IO 实现附件的上传与下载。在 GO 中&#xff0c;有多种方式可以遍历文件目录&#xff0c;获取文件路径&#xff0c;本文从使用层面上论述这些函数。 预先准备一个包含子目录的目录&#xff0c;用于遍历测试&#…

YOLOv5-Openvino和ONNXRuntime推理【CPU】

1 环境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包&#xff0c;主要用于对深度推理做优化。 Openvino内部集成了Opencv、Tens…

政安晨【TypeScript高级用法】(一):类与对象

为了在今后使用Cocos引擎开发虚拟场景&#xff0c;咱们首先要了解TypeScript语言。 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: AI虚拟世界大讲堂 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

NestJS核心成员组成-中间件

关于MiddleWare 从本质来说&#xff0c;我们使用NestJS的时候&#xff0c;有百分之九十的原因是我们只想要一个能提供API的服务&#xff0c;即便是一个简单的由数据库https请求的后台&#xff0c;也能满足百分之九十的人了。 对于有Express以及Koa开发的朋友来说&#xff0c;…

java中的map集合

1.jdk8 Map接口实现类的特点&#xff1a; ①Map与Collection并列存在&#xff0c;用于保存具有映射关系的数据&#xff1a;Key-Value; ②Map中的key与value可以是任何引用类型的数据&#xff0c;会封装到HashMap$Node对象中&#xff1b; ③Map中的key不允许重复&#xff0c;…

【计算机网络】IO多路转接之poll

文章目录 一、poll函数接口二、socket就绪条件三、poll的优点四、poll的缺点五、poll使用案例--只读取数据的server服务器1.err.hpp2.log.hpp3.sock.hpp4.pollServer.hpp5.main.cc 一、poll函数接口 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int t…

YOLOv9独家原创改进|使用可改变核卷积AKConv改进RepNCSPELAN4

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 AKConv是一种具有任意数量的参数和任意采样形状的可变卷积核&#xff0c;对不规则特征有更好的提取效果。 RepNCSPELAN4是YOLOv9中的…

Pytorch学习 day03(Tensorboard)

Tensorboard Tensorboard能够可视化loss的变化过程&#xff0c;便于我们查看模型的训练状态&#xff0c;也能查看模型当前的输入和输出结果 在Pycharm中&#xff0c;可以通过按住ctrl&#xff0c;并左键点击某个库来进入源文件查看该库的使用方法 SummaryWriter是用来向log_di…

【计算机操作系统】操作系统的诞生

目录 相关概念&#xff1a; 一、手工操作阶段 二、脱机输入/输出阶段 &#xff08;1&#xff09;脱机输入技术 &#xff08;2&#xff09;脱机输出技术 三、单道批处理阶段 四、多道批处理阶段 五、分时技术产生 六、实时系统产生 相关概念&#xff1a; ① 作业&#…

数据结构从入门到精通——链表

链表 前言一、链表1.1 链表的概念及结构1.2 链表的分类1.3 链表的实现1.4 链表面试题1.5 双向链表的实现 二、顺序表和链表的区别三、单项链表实现具体代码text.htext.cmain.c单链表的打印空间的开辟链表的头插、尾插链表的头删、尾删链表中元素的查找链表在指定位置之前、之后…

【C++基础】STL容器面试题分享||上篇

&#x1f308;欢迎来到C基础专栏 &#x1f64b;&#x1f3fe;‍♀️作者介绍&#xff1a;前PLA队员 目前是一名普通本科大三的软件工程专业学生 &#x1f30f;IP坐标&#xff1a;湖北武汉 &#x1f349; 目前技术栈&#xff1a;C/C STL 1.请说说 STL 的基本组成部分2.详细的说&…

SwiftUI 在 App 中弹出全局消息横幅(下)

功能需求 在 SwiftUI 开发的 App 界面中,有时我们需要在全局层面向用户展示一些消息: 如上图所示:我们弹出的全局消息横幅位于所有视图之上,这意味这它不会被任何东西所遮挡;而且用户可以点击该横幅关闭它。这是怎么做到的呢? 在本篇博文中,您将学到以下内容 功能需求…

C++/WinRT教程(第三篇)API的使用

目录 前言 Windows API 在WinRT中的投影 C/WinRT的头文件&#xff08;投影标头&#xff09; 通过对象、接口或通过 ABI 访问成员 投影类型的初始化方法 不要错误地使用延迟初始化 不要错误地使用复制构造 使用 winrt::make 进行构造 标准构造方法 在WinRT组件中实现A…

Linux--文件(2)-重定向和文件缓冲

命令行中的重定向符号 介绍和使用 在Linux的命令行中&#xff0c;重定向符号用于将命令的输入或输出重定向到文件或设备。 常见的重定向符号&#xff1a; 1.“>“符号&#xff1a;将命令的标准输出重定向到指定文件中&#xff0c;并覆盖原有的内容。 2.”>>“符号&a…

C/C++工程师面试题(STL篇)

STL 中有哪些常见的容器 STL 中容器分为顺序容器、关联式容器、容器适配器三种类型&#xff0c;三种类型容器特性分别如下&#xff1a; 1. 顺序容器 容器并非排序的&#xff0c;元素的插入位置同元素的值无关&#xff0c;包含 vector、deque、list vector&#xff1a;动态数组…

[Unity3d] 网络开发基础【个人复习笔记/有不足之处欢迎斧正/侵删】

TCP/IP TCP/IP协议是一 系列规则(协议)的统称&#xff0c;他们定义了消息在网络间进行传输的规则 是供已连接互联网的设备进行通信的通信规则 OSI模型只是一个基本概念,而TCP/IP协议是基于这个概念的具体实现 TCP和UDP协议 TCP:传输控制协议&#xff0c;面向连接&#xff0c…

面试经典150题——简化路径

"A goal is a dream with a deadline." - Napoleon Hill 1. 题目描述 2. 题目分析与解析 2.1 思路一 这个题目开始看起来并不太容易知道该怎么写代码&#xff0c;所以不知道什么思路那就先模拟人的行为&#xff0c;比如对于如下测试用例&#xff1a; 首先 /代表根…