力扣hot100题解(python版69-73题)

69、有效的括号

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

思路解答:

  1. 初始化一个空栈。
  2. 遍历字符串中的每个字符:
    • 如果当前字符是左括号(‘(’,‘{’,‘[’),则将其推入栈中。
    • 如果当前字符是右括号(‘)’,‘}’,‘]’),则检查栈顶元素:
      • 如果栈为空,或者栈顶元素与当前字符不匹配,则返回 False。
      • 如果栈顶元素与当前字符匹配,则弹出栈顶元素。
  3. 在遍历完成后,检查栈是否为空。如果栈为空,则说明所有括号都匹配,返回 True;否则返回 False。
def isValid(s: str) -> bool:stack = []mapping = {')': '(', '}': '{', ']': '['}for char in s:if char in mapping.values():stack.append(char)elif char in mapping:if not stack or mapping[char] != stack.pop():return Falsereturn not stack

70、最小栈

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

实现 MinStack 类:

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

示例 1:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]输出:
[null,null,null,null,-3,null,0,-2]解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

提示:

  • -231 <= val <= 231 - 1
  • poptopgetMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 104

思路解答:

借用一个辅助栈 min_stack,用于存获取 stack 中最小值。

push() 方法: 每当push()新值进来时,如果 小于等于 min_stack 栈顶值,则一起 push() 到 min_stack,即更新了栈顶最小值。
pop() 方法: 判断将 pop() 出去的元素值是否是 min_stack 栈顶元素值(即最小值),如果是则将 min_stack 栈顶元素一起 pop(),这样可以保证 min_stack 栈顶元素始终是 stack 中的最小值。
getMin()方法: 返回 min_stack 栈顶即可。

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:if self.stack[-1] == self.min_stack[-1]:self.min_stack.pop()self.stack.pop()def top(self) -> int:return self.stack[-1]def getMin(self) -> int:return self.min_stack[-1]

71、字符串解码

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

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"

示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"

示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

提示:

  • 1 <= s.length <= 30
  • s 由小写英文字母、数字和方括号 '[]' 组成
  • s 保证是一个 有效 的输入。
  • s 中所有整数的取值范围为 [1, 300]

思路解答:

  1. 初始化一个空栈,用于存储当前的解码字符串。
  2. 遍历输入字符串中的每个字符:
    • 如果当前字符不是右括号 ],则将其推入栈中。
    • 如果当前字符是右括号 ],则从栈中弹出字符,直到遇到左括号 [,这些弹出的字符构成一个重复的字符串。
      • 继续弹出栈中的字符,直到栈顶是数字,将这个数字解析为重复次数 k
      • 将重复次数 k 和构成的重复字符串相乘,得到新的重复字符串,并推入栈中。
  3. 最终栈中剩下的字符即为解码后的字符串。
def decodeString(s: str) -> str:stack = []current_str = ""current_num = 0for char in s:if char.isdigit():current_num = current_num * 10 + int(char)elif char.isalpha():current_str += charelif char == "[":stack.append(current_str)stack.append(current_num)current_str = ""current_num = 0elif char == "]":num = stack.pop()prev_str = stack.pop()current_str = prev_str + num * current_strreturn current_str

72、每日温度

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

示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

示例 2:

输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例 3:

输入: temperatures = [30,60,90]
输出: [1,1,0]

提示:

  • 1 <= temperatures.length <= 105
  • 30 <= temperatures[i] <= 100

思路解答:

  1. 初始化一个空栈 stack 和一个长度与输入数组相同的结果数组 answer,初始值为0。
  2. 从左到右遍历温度数组 temperatures
    • 如果栈不为空且当前温度大于栈顶索引对应的温度:
      • 弹出栈顶索引 top_index,并计算当前索引与 top_index 之间的天数差,即 i - top_index,这个天数差即为 top_index 对应的下一个更高温度的天数。
      • answer[top_index] 更新为这个天数差。
    • 将当前索引 i 推入栈中。
  3. 返回结果数组 answer
def dailyTemperatures(temperatures: list[int]) -> list[int]:n = len(temperatures)stack = []answer = [0] * nfor i in range(n):while stack and temperatures[i] > temperatures[stack[-1]]:index = stack.pop()answer[top_index] = i - indexstack.append(i)return answer

73、柱状图中最大的矩形

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

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

示例 1:

img

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

img

输入: heights = [2,4]
输出: 4

提示:

  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104

思路解答:

  1. 初始化一个空栈 stack,并在输入数组的末尾添加一个高度为0的柱子,这样可以确保所有柱子都被处理到。
  2. 从左到右遍历柱子的高度数组:
    • 如果栈为空或者当前柱子高度大于等于栈顶柱子的高度,将当前柱子的索引压入栈中。
    • 如果当前柱子的高度小于栈顶柱子的高度,说明可以计算以栈顶柱子为高度的矩形的面积了:
      • 弹出栈顶柱子的索引 top
      • 计算以 top 为高度的矩形的宽度,即 i - stack[-1] - 1,其中 i 是当前柱子的索引,stack[-1] 是栈中下一个柱子的索引。注:当前高度对应的最大面积 的 宽度 是 右边比他小的第一个 - 左边比它小的第一个 - 1
      • 计算以 top 为高度的矩形的面积,即 width * heights[top],其中 width 是宽度,heights[top] 是栈顶柱子的高度。
      • 更新最大面积。
  3. 返回最大面积。
def largestRectangleArea(heights: list[int]) -> int:heights.append(0)  # 添加高度为0的柱子n = len(heights)stack = []max_area = 0for i in range(n):while stack and heights[i] < heights[stack[-1]]:top = stack.pop()width = i if not stack else i - stack[-1] - 1max_area = max(max_area, width * heights[top])stack.append(i)return max_area

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

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

相关文章

浅易理解:YOLOv1

You Only Look Once: Unified, Real-Time Object Detection &#xff08;读原英文版YOLOv1 &#xff0c;让我更深刻理解YOLO内容&#xff0c;保留部分原英文译文&#xff09; Abstract 2015年YOLO团队提出了一种名为YOLO的新目标检测方法。以往的目标检测工作大多将分类器转用…

leetcode刷题(javaScript)——堆相关场景题总结

堆是什么&#xff1f;堆都能用树表示&#xff0c;并且一般树的实现都是利用链表。平时使用的最多的是二叉堆&#xff0c;它可以用完全二叉树表示&#xff0c;二叉堆易于存储&#xff0c;并且便于索引。在堆的实现时注意&#xff1a;因为是数组&#xff0c;所以父子节点的关系就…

气膜建筑是由什么材料制成的?PVDF膜材的革新应用值得期待吗?

随着科技的不断进步和发展&#xff0c;建筑行业也在不断涌现新型的建筑材料。气膜建筑作为其中一种创新的建筑膜材&#xff0c;在体育馆、运动场馆、展览厅等场所得到了广泛的应用。那么&#xff0c;究竟是什么材料构成了气膜建筑呢&#xff1f;轻空间小编将为您详细介绍。 气膜…

Python数值方法在工程和科学问题解决中的应用

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 随着计算机技术的不断发展&#xff0c;Python作…

《行业指标体系白皮书》重磅发布,剖析指标建设困境,构建前瞻性的指标体系(附下载)

正处于企业指标建设过程中的你&#xff0c;是否经常遇到这样的问题&#xff1a; • 各个部门独立建设信息系统&#xff0c;由此产生的指标定义和计算方式各异&#xff0c;导致管理层无法快速准确地掌握整体业务运行状况 • 缺乏对指标的统一管理和规范&#xff0c;产生重复的指…

OPCUA 学习笔记:程序模型

无论是边缘控制器&#xff0c;还是PLC 中&#xff0c;除了信息模型之外&#xff0c;还有应用程序&#xff0c;这些程序可能是IEC61131-3 编写的程序&#xff0c;也可能是其它程序开发的可执行程序。 尽管OPCUA 描述模型能力很强&#xff0c;但是它缺乏算法的描述方式。但是OPCU…

欧盟地区 iOS DMA 更新后,Brave浏览器安装量激增

自《欧洲数字市场法案》发布后&#xff0c;苹果公司为遵守该法案&#xff0c;在 iOS 17.4 中引入了一项新功能&#xff0c;要求欧盟用户从包括 Brave 在内的列表中选择一个默认网络浏览器。 用户在安装更新后首次打开 Safari 时&#xff0c;会弹出一则消息提示用户从本国流行的…

【C++教程从0到1入门编程】第九篇:STL中Vector类

一、vector的介绍 1.vector的介绍 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&…

js的异常处理

1、throw抛异常 throw抛出异常信息&#xff0c;程序也会终止执行&#xff1b; throw后面跟的是错误提示信息&#xff1b; new Error() 配个throw使用&#xff0c;能设置更详细的错误信息。 function counter(x,y) {if (!x || !y) {throw new Error(参数不能为空)}retu…

技术上的现货黄金开户可以免一下吗?

现货黄金是国际市场上的电子黄金合约买卖&#xff0c;是一种自由而灵活的投资方式&#xff0c;投资者可以根据自己对行情的判断选择交易的方向&#xff0c;只要成功的抓住了一点市场波动&#xff0c;就可以借助杠杆的作用&#xff0c;把它转化为较大的收益。 现货黄金实行保证金…

利用RPA自动化,批量上传资源一个账号搞了7700+收益!

您好&#xff0c;我是码农飞哥&#xff08;wei1148s&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

日期问题 刷题笔记

思路 枚举 19600101 到20591231这个区间的数 获得年月日 判断是否合法 如果合法 关于题目给出的日期 有三种可能 年/月/日 日/月/年 月/日/年 判断 是否和题目给出的日期符合 如果符合 输出 闰年{ 1.被4整除不被100整除 2.被400整除} 补位写法“%02d" 如果不…