【力扣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 # 匹配不上就返回Falseelse: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 =[], '', 0for c in s:if c.isdigit():num = num * 10 + int(c)  # 为了获得连续数字比如"100"→100elif 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 = '', 0while i < len(s):if s[i].isdigit():num = num * 10 + int(s[i])  # 为了获得连续数字比如"100"→100elif 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 resreturn 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):# 如果栈顶有数且当前数大于栈顶,记录栈顶的结果,popwhile st and temperatures[i] > temperatures[st[-1]]:res[st[-1]] = i - st[-1]st.pop()# 栈为空 或 当前数小于等于栈顶,pushst.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     # 初始化为-1right_i[n-1] = n   # 初始化为nfor i in range(1, n):  # 从前往后,如果前一个数不比当前小,则找前一个数的left_ilast = i - 1while last >= 0 and heights[last] >= heights[i]:last = left_i[last]left_i[i] = lastfor i in range(n-2, -1, -1):last = i + 1       # 从后往前,如果后一个数不比当前小,则找后一个数的right_iwhile last <= n - 1 and heights[last] >= heights[i]:last = right_i[last]right_i[i] = lastres = 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]  # 前后补0res = 0for 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 = 0for 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:  # 特殊处理两个元素的情况breakleft = 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.rhkb.cn/news/269051.html

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

相关文章

TCP/UDP模型:2024/2/29

作业1&#xff1a;TCP模型 服务器端&#xff1a; #include <myhead.h> #define SER_IP "192.168.199.129" #define SER_PORT 8899int main(int argc, const char *argv[]) {//1.创建用于连接的套接字文件int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){per…

mac下终端命令提示补全

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 mac下终端命令提示补全 前言Zsh-autosuggestions原理解析&#xff1a;智能提示的工作方式1. 命令历史分析&#xff1a;2. 智能提示生成&#xff1a;3. 用户交互和选择&#xff1a;4. 配置和个性化&…

ctf_show笔记篇(web入门---爆破)

爆破 21&#xff1a;直接bp抓包跑字典&#xff0c;需base64加密 22&#xff1a;可用工具跑也可用浏览器找还可以用网上做好的域名查找去找 23&#xff1a;此题需跑脚本已经附上自写脚本 最后跑出来六个答案一个一个尝试得到答案为3j import hashlibm "0123456789qwert…

redis中的分布式锁(setIfAbsent)(expire)

目录 应用场景 代码实例1&#xff1a; 代码实例2&#xff1a; setIfAbsent&#xff1a; expire&#xff1a; 举例说明&#xff1a; 代码实例3&#xff1a; 代码实例4&#xff1a; 还是一个同事问的一个问题&#xff0c;然后闲着没事就记录下来了。多人操作同一个保单&a…

npm、cnpm、pnpm使用详细

简介&#xff1a; npm&#xff1a;npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;用于安装、更新、卸载Node.js的模块和包。它提供了一个命令行界面&#xff0c;使得开发者可以轻松地管理项目依赖。npm 是 nodejs 中的一部分&#xff0c;…

vue3+uniapp在微信小程序实现一个2048小游戏

一、效果展示 二、代码 <template><view class"page"><view class"top"><view class"score">得分:{{total}}</view><view class"time">用时:{{allTime}}s</view></view><view cl…

网络工程师笔记8

华为VRP系统 设备管理方式 web管理方式 命令行管理方式 修改命令&#xff1a;undo 基础配置命令

期货开户保证金保障市场正常运转

期货保证金是什么&#xff1f;在期货市场上&#xff0c;采取保证金交易制度&#xff0c;投资者只需按期货合约的价值&#xff0c;交一定比率少量资金即可参与期货合约买卖交易&#xff0c;这种资金就是期货保证金。期货保证金&#xff08;以下简称保证金〕按性质与作用的不同。…

记录SSM项目集成Spring Security 4.X版本 之 加密验证和记住我功能

目录 前言 一、用户登录密码加密认证 二、记住我功能 前言 本次笔记的记录是接SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示-CSDN博客https://blog.csdn.net/u011529483/article/details/136255768?spm1001.2014.3001.5502 文章之后补…

神经网络结构——CNN、RNN、LSTM、Transformer !!

文章目录 前言 一、什么是CNN 网络结构 解决问题 工作原理 实际应用 二、什么是RNN 网络结构 解决问题 工作原理 应用场景 三、什么是LSTM 网络结构 解决问题 工作原理 应用场景 四、什么是Transformer 网络结构 解决问题 工作原理 BERT GPT 前言 本文将从什么是CNN&#xff1…

Redis的介绍与使用

文章目录 Redis简介安装RedisRedis常用命令全局命令String类型数据Hash哈希类型数据List列表类型数据Set集合类型数据SortedSet有序集合类型数据 一些选择题一些选择题 Redis简介 Redis是一款基于键值对的NoSQL数据库&#xff0c;它的值支持多种数据结构&#xff1a; 字符串(s…

代码随想录算法训练营第26天—回溯算法06 | ● *332.重新安排行程 ● *51. N皇后 ● *37. 解数独 ● 总结

*332.重新安排行程 https://programmercarl.com/0332.%E9%87%8D%E6%96%B0%E5%AE%89%E6%8E%92%E8%A1%8C%E7%A8%8B.html 考点 图论里的深度优先搜索&#xff08;本题使用回溯来解决&#xff09;这是一道hard题&#xff0c;一刷先放过去&#xff0c;二刷有精力再做 我的思路 无思…

【AI Agent系列】【MetaGPT多智能体学习】4. 基于MetaGPT的Team组件开发你的第一个智能体团队

本系列文章跟随《MetaGPT多智能体课程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并实践多智能体系统的开发。 本文为该课程的第四章&#xff08;多智能体开发&#xff09;的第二篇笔记。主要是对MetaGPT中Team组件…

二叉搜索树题目:将有序数组转换为二叉搜索树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法证明代码复杂度分析 题目 标题和出处 标题&#xff1a;将有序数组转换为二叉搜索树 出处&#xff1a;108. 将有序数组转换为二叉搜索树 难度 4 级 题目描述 要求 给定整数数组 nums \texttt{nums}…

力扣 第 125 场双周赛 解题报告 | 珂学家 | 树形DP + 组合数学

前言 整体评价 T4感觉有简单的方法&#xff0c;无奈树形DP一条路上走到黑了&#xff0c;这场还是有难度的。 T1. 超过阈值的最少操作数 I 思路: 模拟 class Solution {public int minOperations(int[] nums, int k) {return (int)Arrays.stream(nums).filter(x -> x <…

springboot230基于Spring Boot在线远程考试系统的设计与实现

在线远程考试系统设计与实现 摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到…

协议和序列化反序列化

“协议”和序列化反序列化 “协议”的概念&#xff1a; “协议”本身是一种约定俗成的东西&#xff0c;由通讯双方必须共同遵从的一组约定&#xff0c;因此我们一定要将这种约定用计算机语言表达出来&#xff0c;此时双方计算机才能识别约定的相关内容 我们把这个规矩叫做“…

今晚打老虎:用katalon解决接口/自动化测试拦路虎--参数化

不管是做接口测试还是做自动化测试&#xff0c;参数化肯定是一个绕不过去的坎。 因为我们要考虑到多个接口都使用相同参数的问题。所以&#xff0c;本文将讲述一下katalon是如何进行参数化的。 全局变量 右侧菜单栏中打开profile&#xff0c;点击default&#xff0c;打开之后…

【LeetCode】升级打怪之路 Day 11:栈的应用、单调栈

今日题目&#xff1a; Problem 1: 栈的应用 155. 最小栈 | LeetCode20. 有效的括号 | LeetCode150. 逆波兰表达式求值 | LeetCode Problem 2: 单调栈 496. 下一个更大元素 I739. 每日温度503. 下一个更大元素 II 目录 Problem 1&#xff1a;栈 - “先进后出”的应用LC 155. 最…

IO(Linux)

文件系统 前言1. 回顾关于C文件部分函数2. 一些文件知识的共识3. 相对路径4. fwrite中的\0 一、文件描述符fd1. 概念2. 系统调用① open 和 close② write③ read 和 lseek 3. 缺省打开的fd 二、重定向1. 原理2. 系统调用dup23. stdout和stderr的区别4. 进程替换和原来进程文件…