【力扣hot100】刷题笔记Day21

前言

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

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

后言

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SqlServer 默认值约束示例

创建表&#xff0c;创建时指定 money 字段默认值为0.00&#xff1b; create table t_24 ( account varchar(19) not null, id_card char(18) not null, name varchar(20) not null, money decimal(16,2) default 0.00 not null ); 录入2条记录&#xff0c;money字…

Unity之街机捕鱼

目录 &#x1f62a;炮台系统 &#x1f3b6;炮口方向跟随鼠标 &#x1f3b6;切换炮台 &#x1f62a;战斗系统 &#x1f3ae;概述 &#x1f3ae;单例模式 &#x1f3ae;开炮 &#x1f3ae;子弹脚本 &#x1f3ae;渔网脚本 &#x1f3ae;鱼属性信息的脚本 &#x1f6…

08. Nginx进阶-Nginx动静分离

简介 什么是动静分离&#xff1f; 通过中间件将动态请求和静态请求进行分离。分离资源&#xff0c;减少不必要的请求消耗&#xff0c;减少请求延时。 动静分离的好处 动静分离以后&#xff0c;即使动态服务不可用&#xff0c;静态资源仍不受影响。 动静分离示意图 动静分离…

【学习心得】网站运行时间轴(爬虫逆向)

一、网站运行时间轴 掌握网站运行时间轴&#xff0c;有助于我们对“请求参数加密”和“响应数据加密”这两种反爬手段的深入理解。 二、从网站运行的时间轴角度来理解两种反爬手段 1、加载HTML&#xff1a; 这是浏览器访问网站时的第一步&#xff0c;服务器会返回基础…

bashplotlib,一个有趣的 Python 数据可视化图形库

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 什么是Bashplotlib库&#xff1f; 安装Bashplotlib库 使用Bashplotlib库 Bashplotlib库的功能特性 1. 绘…

Git 指令深入浅出【2】—— 分支管理

Git 指令深入浅出【2】—— 分支管理 分支管理1. 常用分支管理指令2. 合并分支合并冲突合并模式 3. 实战演习 分支管理 1. 常用分支管理指令 # 查看本地分支 git branch# 查看远程分支 git branch -r# 查看全部分支 git branch -aHEAD 指向的才是当前的工作分支 # 查看当前分…

LabVIEW高温摩擦磨损测试系统

LabVIEW高温摩擦磨损测试系统 介绍了一个基于LabVIEW的高温摩擦磨损测试系统的软件开发项目。该系统实现高温条件下材料摩擦磨损特性的自动化测试&#xff0c;通过精确控制和数据采集&#xff0c;为材料性能研究提供重要数据支持。 项目背景 随着材料科学的发展&#xff0c;…

数据分析之Logistic回归分析(二元逻辑回归、多元有序逻辑回归、多元无序逻辑回归)

1、Logistic回归分类 在研究X对于Y的影响时&#xff1a; 如果Y为定量数据&#xff0c;那么使用多元线性回归分析&#xff1b;如果Y为定类数据&#xff0c;那么使用Logistic回归分析。 结合实际情况&#xff0c;可以将Logistic回归分析分为3类&#xff1a; 二元Logistic回归…

【办公类-21-08】三级育婴师 多个二级文件夹的docx合并成PDF

背景需求: 前期制作了单题文件夹 【办公类-21-07】新建文件夹 三级育婴师操作参考题目-CSDN博客文章浏览阅读439次&#xff0c;点赞7次&#xff0c;收藏10次。【办公类-21-07】新建文件夹 三级育婴师操作参考题目https://blog.csdn.net/reasonsummer/article/details/1363360…

SpringCloud(19)之Skywalking应用上篇

一、Skywalking概述 随着互联网架构的扩张&#xff0c;分布式系统变得日趋复杂&#xff0c;越来越多的组件开始走向分布式化&#xff0c;如微服务、消 息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用&#xff0c;这些组件共同构成了繁杂的分布式网络。 思考以下…

使用Julia语言及R语言进行格拉布斯检验

在日常的计量检测工作中经常会处理各种数据&#xff0c;在处理数据之前会提前使用格拉布斯准则查看数据中是否存在异常值&#xff0c;如果存在异常值的话应该重新进行计量检测&#xff0c;没有异常值则对数据进行下一步操作。判断异常值常用的格拉布斯方法基于数据来自正态分布…

深度学习系列61:在CPU上运行大模型

1. 快速版 1.1 llamafile https://github.com/Mozilla-Ocho/llamafile 直接下载就可以用&#xff0c;链接为&#xff1a;https://huggingface.co/jartine/llava-v1.5-7B-GGUF/resolve/main/llava-v1.5-7b-q4.llamafile?downloadtrue 启动&#xff1a;./llava-v1.5-7b-q4.lla…

shell 小数比较大小

shell 小数比较大小 #!/bin/bash num15.9 result$(echo "$num1 > 5" | bc) #$num1 > 5 时返回0&#xff0c;$num1 < 5 时返回1 echo $result if [ $result -gt 0 ]; then echo ">>>>>>> $1 $2 数据异常: $hive_num" else e…

适用于 Windows 的 5 款最佳免费数据恢复软件榜单

每个计算机用户都曾经历过数据丢失的情况。很容易错误地删除重要的文件和文件夹&#xff0c;当发生这种情况时&#xff0c;可能会导致不必要的心痛和压力。值得庆幸的是&#xff0c;可以恢复 Windows PC 上丢失的数据。在本文中&#xff0c;我们将分享您可以使用的五种最佳 Win…

HTML+CSS:花式加载

效果演示 实现了一个动态加载文本效果&#xff0c;通过定义变量和应用动画效果来实现文本的动态展示。 Code <div class"container"><h1>loading...</h1> </div>:root {--text-color: orangered; /* 定义文本颜色变量为橙红色 */--inner-st…

【鸿蒙 HarmonyOS 4.0】登录流程

一、背景 登录功能在应用中是一个常用模块&#xff0c;此次使用 HarmonyOS 实现登录流程&#xff0c;包含页面呈现与网络请求。 二、页面呈现 三、实现流程 3.1、创建项目 构建一个ArkTS应用项目(Stage模型)&#xff0c;今天创建流程可查看官网教程&#xff1a;文档中心 目…

Serial studio 入门教程(安装+使用)

最近有一个朋友推荐了一个嵌入式调试工具 serial studio 用了一下很方便 今天记录一下过程 介绍 serial studio 支持多种协议和可自己定制的界面 安装 Serial Studio 国内下载地址&#xff1a; serial studio 国内镜像 安装时出现以下界面 点更多 就可以继续安装了 使用 …

新手想玩硬件,买单片机还是树莓派好?

新手想玩硬件&#xff0c;买单片机还是树莓派好&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#x…

7.1.3 Selenium的用法2

目录 1. 切换 Frame 2. 前进后退 3. 对 Cookies 操作 4. 选项卡管理(了解) 5. 异常处理 6. 反屏蔽 7. 无头模式 1. 切换 Frame 我们知道网页中有一种节点叫作 iframe&#xff0c;也就是子 Frame&#xff0c;相当于页面的子页面&#xff0c;它的结构和外部网页的结构完全…

6、聊聊cors漏洞

文章目录 1、小结1.1、存在漏洞的情况&#xff1a;1.2、常见的cors设置&#xff08;php举例&#xff09; 2、漏洞复现2.1、无需cookie2.2、需要cookie2.3、需要cookie的方式利用限制 3、补充与疑惑 1、小结 cors漏洞在20230404基本无了 估计很多乙方工作得同学都拿这个漏洞凑…