【Leetcode】top 100 栈

基础知识补充

1.栈是一种运算受限的线性表,仅允许在一端进行插入和删除操作;

2.可用列表实现,list.append(val) // list.pop()

题目
20 有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。
class Solution(object):def isValid(self, s):""":type s: str:rtype: bool"""stack = []for strr in s:if strr=='(' or strr=='[' or strr=='{':    #左括号,入栈stack.append(strr)else:                                      #右括号,判断是否匹配if not stack: return Falseelse:pre = stack.pop()if strr == ')' and pre != '(': return Falseelif strr == ']' and pre != '[': return Falseelif strr == '}' and pre != '{': return False    return stack==[] 

写完初步代码发现实际上需要找的是右括号,然后判断右括号是否与对应左括号匹配,可以用 dict 构造成对关系

class Solution(object):def isValid(self, s):""":type s: str:rtype: bool"""stack = []dict = {')':'(', ']':'[', '}':'{'}for strr in s:if not stack: stack.append(strr)else:                                     if strr in dict:     # 右括号,判断是否匹配if stack[-1]==dict[strr]: stack.pop()else: return Falseelse:                # 左括号,入栈stack.append(strr)return not stack 
 155 最小栈

 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

正常维护一个栈完成入栈、出栈、取栈顶元素操作;

要求在常数时间内检索到最小元素,即用变量记录当前栈的最小值,与正常栈一起维护;

class MinStack(object):def __init__(self):self.stack = []self.min = 2**31def push(self, val):""":type val: int:rtype: None"""if not self.stack: self.stack.append([val, val])else:self.stack.append([val, min(val, self.stack[-1][1])])def pop(self):""":rtype: None"""if self.stack: self.stack.pop()def top(self):""":rtype: int"""if self.stack: nums = self.stack.pop()self.stack.append(nums)return nums[0]def getMin(self):""":rtype: int"""if self.stack: nums = self.stack.pop()self.stack.append(nums)return nums[1]
 394 字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

class Solution(object):def decodeString(self, s):""":type s: str:rtype: str"""stack = []for strr in s:if strr != ']': stack.append(strr)else:res, num, bit = [], 0, 1while stack:if stack[-1]=='[': breakval = stack.pop()res = list(val) + res    # 注意先后顺序stack.pop()while stack:val = stack.pop()if val>='0' and val<='9':# num = val + num       也可以用字符串num = num+int(val)*bit      bit = bit*10else: stack.append(val)breakstack.append(''.join(res*num))return ''.join(stack)
739 每日温度

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

 维护一个递减的单调栈,初始化间隔变量interval,若入栈元素大于栈顶元素,弹出栈顶元素并将其对应的输出坐标置为interval,然后 interval+1,继续循环至前一个大于等于当前元素的值;

问题出在怎么通过弹出的元素定位到其输出坐标?  坐标表示,即栈内维护的是温度对应的下标,间隔 interval 就自然转化为入栈元素下标和出栈元素下标的差值;

class Solution(object):def dailyTemperatures(self, temperatures):""":type temperatures: List[int]:rtype: List[int]"""stack = []out = [0] * len(temperatures)# for i, tmp in enumerate(temperatures):#     if not stack or temperatures[stack[-1]] >= tmp:   # 栈空/前一温度大于等于当前温度#         stack.append(i)#     else:                                             # 前一温度小于当前温度#         while stack:#             if temperatures[stack[-1]] >= tmp:break   # 直至遇到前一温度大于等于当前温度#             else:#                 idx = stack.pop()#                 out[idx] = i-idx#         stack.append(i)# if/else 都要 append 简化一下:for i, tmp in enumerate(temperatures):while stack and temperatures[stack[-1]] < tmp:idx = stack.pop()out[idx] = i-idxstack.append(i)return out
 84 柱状图中的最大矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

对于高度为 height[i] 的矩形,最大面积的宽为其左右第一个小于该高度的元素下标差-1,故将问题转换为给定高度为 height[i],求其左右第一个小于该高度的元素下标差;

left[i] 为 height[i] 的左界下标,right[i] 为 height[i] 的右界下标;单调栈问题

class Solution(object):def largestRectangleArea(self, heights):""":type heights: List[int]:rtype: int"""n = len(heights)left, right = [-1]*n, [n]*nstack = []for i in range(n):while stack and heights[stack[-1]] >= heights[i]: # 找到val的左界stack.pop()if stack: left[i] = stack[-1]stack.append(i)print(left)stack = []for i in range(n-1, -1, -1):         while stack and heights[stack[-1]] >= heights[i]: # 找到val的右界stack.pop()if stack: right[i] = stack[-1]stack.append(i)print(right)out = 0for i in range(n):ans = heights[i]*(right[i]-left[i]-1)out = max(ans, out)return out

42接雨水 类似,待后续一起总结

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

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

相关文章

Linux:详解TCP报头类型

文章目录 温习序号的意义序号和确认序号报文的类型 TCP报头类型详解ACK: 确认号是否有效SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段FIN: 通知对方, 本端要关闭了PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走RST: 对方要求重新建立连接; 我们把携带RST标识的称…

如何在ArcGIS中查看栅格数据的值类型(整数或浮点数)

在 ArcGIS 中查看栅格数据的值类型&#xff08;整数或浮点数&#xff09;&#xff0c;您可以按照以下步骤操作&#xff1a; 1. **点击栅格单元格**&#xff1a; - 使用“信息”工具&#xff08;Identify Tool&#xff0c;通常是一个带放大镜和一个字母 i 的图标&#xff09…

python--os和os.path模块

>>> import os >>> #curdir #获取当前脚本的绝对路径 >>> os.curdir . >>> import os.path >>> #获取绝对路径 >>> os.path.abspath(os.curdir) C:\\Users\\GUOGUO>>> #chdir #修改当前目录 >&g…

JAVA面试大全之数据库篇

目录 1、原理和SQL 1.1、什么是事务?事务基本特性ACID? 1.2、数据库中并发一致性问题? 1.3、事务的隔离等级? 1.4、ACID靠什么保证的呢?

创建一个vue3 + ts + vite 项目

vite 官网&#xff1a; https://cn.vitejs.dev/guide/ 兼容性注意 Vite 需要 Node.js 版本 18&#xff0c;20。然而&#xff0c;有些模板需要依赖更高的 Node 版本才能正常运行&#xff0c;当你的包管理器发出警告时&#xff0c;请注意升级你的 Node 版本。 安装项目 1. 使用n…

Linux:TCP协议的三次握手和四次挥手

文章目录 三次握手四次挥手为什么要进行三次握手&#xff1f;三次握手也不安全 本篇解析的主要是TCP的三次握手和四次挥手的过程 三次握手 如图所示&#xff0c;在TCP要进行链接的时候&#xff0c;其实是要进行三次握手的 第一次握手是指&#xff0c;此时客户端要给服务器发送…

【Qt】QMainWindow

目录 一、概念 二、菜单栏 2.1 创建菜单栏 2.2 在菜单栏中添加菜单 2.3 创建菜单项 2.4 在菜单项之间添加分割线 三、工具栏 3.1 创建工具栏 3.2 设置停靠位置 3.3 设置浮动属性 3.4 设置移动属性 四、状态栏 4.1 状态栏的创建 4.2 显示实时消息 4.3 显示永久消…

Vue性能优化--gZip

一、gZip简单介绍 1.1 什么是gzip gzip是GNUzip的缩写&#xff0c;最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术&#xff0c;web服务器和客户端&#xff08;浏览器&#xff09;必须共同支持gzip。目前主流的浏览器&#xff0c;Chro…

【并发】第二篇 ThreadLocal详解

导航 一. ThreadLocal 简介二. ThreadLocal 源码解析1. get2. set3 .remove4. initialValue三. ThreadLocalMap 源码分析1. 构造方法2. getEntry()3. set()4. resize()5. expungeStaleEntries()6. cleanSomeSlots()7. nextIndex()8. remove()9. 总结ThreadLocalMap四. 内存泄漏…

python习题小练习(挑战全对)

1. (单选题)Python 3.0版本正式发布的时间&#xff1f; A. 1991B. 2000C. 2008D. 1989 2. (单选题)以下关于Python语言中“缩进”说法正确的是&#xff1a; A. 缩进在程序中长度统一且强制使用B. 缩进是非强制的&#xff0c;仅为了提高代码可读性C. 缩进可以用在任何语句之后…

超文本传输协议HTTP

HTTP协议 在网络通信中&#xff0c;我们可以自己进行定制协议&#xff0c;但是也有许多已经十分成熟的应用层协议&#xff0c;比如我们下面说的HTTP协议。 HTTP协议简介 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;协议又叫做超文本传输协议&#xff0c;是一…

带你学习现代C++并发编程

通过对C并发编程的理解&#xff0c;我总结了相关的文档&#xff0c;有需要的可以关注我公众号&#xff0c;并给我留言&#xff01; 这是目录

专升本-现代通信技术5G

现代通信技术 什么是通信&#xff1a; 人与人&#xff0c;人与自然之间通过某种行为或者媒体介质进行信息交流和传递 通信的基本要素&#xff1a; 信源 ----信道&#xff08;噪音-干扰&#xff09;-----信宿 通信技术是什么&#xff1f; 研究从信息的源头到信息的目的地整…

Cookie/Session

1.Cookie HTTP 协议自身是属于 "无状态" 协议. "无状态" 的含义指的是: 默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系. 但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后, 第二…

创建数据库管理账户以及授权

一、创建数据酷管理账户命令 为了保障数据库系统的安全性&#xff0c;以及让 其他用户协同管理数据库&#xff0c;可以在MariaDB数据库管理系统中为他们创建多个专用的数据库管理账户&#xff0c;然后再分配合理的权限&#xff0c;以满足他们的工作需求. 使用root管理员 登录…

机器学习模型——SVM(支持向量机)

基本概念&#xff1a; Support Vector Machine &#xff08;支持向量机&#xff09;: 支持向量&#xff1a;支持或支撑平面上把两类类别划分开来的超平面的向量点。 机&#xff1a;一个算法 SVM是基于统计学习理论的一种机器学习方法。简单地说&#xff0c;就是将数据单元…

自定义类型(二)结构体位段,联合体,枚举

这周一时兴起&#xff0c;想写两篇文章来拿个卷吧&#xff0c;今天也是又来写一篇博客了&#xff0c;也是该结束自定义类型的学习与巩固了。 常常会回顾努力的自己&#xff0c;所以要给自己的努力留下足迹。 为今天努力的自己打个卡&#xff0c;留个痕迹吧 2024.03.30 小闭…

Mybatis在SpringBoot中是如何被加载执行

首先依赖于springboot的自动装配EnableAutoConfiguration注解&#xff0c;这个注解最终帮助我们读取mybatis-spring-boot-autoconfigure-x.x.x.jar中的META-INF\spring.factories配置类&#xff1a; org.springframework.boot.autoconfigure.EnableAutoConfiguration\ org.myb…

Mysql数据库——阻塞语句查询与分析

目录 前言 阻塞语句查询与分析 Show Processlist——查看每个与数据库连接的session状态 非Sleeping状态进程数 执行时间较长进程号 查看当前运行的所有事务 当前锁 被blocking阻塞的事务数 数据库连接数 查看锁状态 正在被使用的表 前言 MySQL阻塞是指并发访问时&…