LeetCode栈题目分析

题目

20 有效的括号

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
自己思路:遍历字符串,遇到左括号则入栈,遇到右括号,若栈为空(该右括号无匹配的左括号),或者 该右括号与栈top左括号不匹配时,字符串无效。若匹配,则左括号出栈。遍历结束后,栈非空则栈内左括号无匹配的右括号,栈为空,则完全匹配。
题解:遇到左括号则将其对应的右括号入栈,遇到右括号则判等。其余部分和自己思路相同。

224 基本计算器

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数。
s 由数字、‘+’、‘-’、‘(’、‘)’、和 ’ ’ 组成,表示一个有效的表达式。
‘+’ 不能用作一元运算(例如, “+1” 和 “+(2 + 3)” 无效),‘-’ 可以用作一元运算(即 “-1” 和 “-(2 + 3)” 是有效的)。
自己思路
中缀表达式转化为后缀表达式。利用操作数栈nums 和 运算符栈ops 进行计算。
扫描表达式,遇到空格接着遍历。遇到操作数 则读取完整的操作数再入栈 nums。遇到左括号 则入栈 ops,遇到右括号,则利用已有的 ops 和 nums 进行运算,直到遇到 ops 中第一个左括号,运算结果存回 nums。遇到运算符,则利用其和 nums 进行计算,直到没有操作或遇到左括号,运算结果存回 nums。
网友给出的处理技巧:
第一个数可能为负数,可先将0入栈 nums,减少边界判断。
括号内首个字符可能为运算符,可进行预处理,将 “(-” 替换为 “(0-” ,加号同理。
题解
括号展开 + 栈。官方题解会超出时间限制。
扫描表达式,遇到空格接着遍历。遇到运算符,则设置sign表示运算的符号(+1/-1)。遇到左括号,则将当前括号的前驱运算符入栈,遇到右括号则出栈。遇到操作数,先求出完整操作数(考虑多位情况,eg:23),再根据sign进行运算即可。

155 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
自己思路:维护一个变量存储最小元素,实现时遇到困难,借助网友题解思路实现。
不使用辅助栈。栈中保存 未插入的(当前)元素和之前最小值(min)的差值。即当前元素 = 之前最小值[min] + 差值。
插入元素:对第一个元素val,min = val,栈中插入差值0。后续元素先插入差值,再更新 min。
弹出元素:弹出的是最小值,即元素= 现在min,则更新最小值为 之前的min = 元素(现在min) - 差值。弹出的不是最小值,则最小值不变,之前min = 现在min。
栈顶元素:栈顶是最小值,则栈顶元素= min。栈顶不是最小值,则现在的min 就是之前的min,栈顶元素= 之前min + 差值。
题解
使用辅助栈。使用一个元素栈正常存储元素,另使用辅助栈存储最小元素,插入弹出元素时,更新最小元素,并插入辅助栈。

946 验证栈序列

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
自己思路:(错误,未考虑到遍历过程中可能出现的栈空情况)
先将 pushed 第一个元素入栈。在栈非空时,判断能否按 poped 出栈,可以则出栈;不能出栈 且 pushed 元素未遍历完,则继续入栈;不能出栈 且 pushed 已全部入栈,则顺序错误。栈空时退出循环,顺序合理。
题解
遍历 pushed 各元素,在栈非空 且 栈顶元素和 poped 元素 相等时,将栈顶元素出栈。否则将 pushed 元素入栈。遍历结束,若栈为空则顺序合理。

739 每日温度

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
自己思路:用双重循环找出比当前温度更高的一天,找到则更新answer,找不到则为0,但该方法会导致超出时间限制错误。
题解
单调栈。
判断是否需要使用单调栈:找出左/右边 比当前数更大/小的第一个数 的位置。
单调栈用于存储各温度的下标。(for)遍历各个温度,(while)在栈非空 且 找到一个更高的温度(当前温度高于 栈顶下标对应的温度)时,更新 栈顶下标对应 answer,并弹出该下标。否则将温度下标不断入栈。

42 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
自己思路:类似单调栈,都为找雨水的右侧柱子,即数组上升位置。但实现时出现了问题。
题解
单调栈。维护一个栈存储 柱子高度对应的下标。
遍历各个柱子高度,当栈非空且遇到柱子高度上升时,记录低洼处下标top 为栈顶元素,并将其出栈;若此时栈为空,则其左侧无柱子,退出循环。否则栈非空,记录左侧柱子下标left 为当前的栈顶元素。雨水高度为 左右侧柱子中更低的高度减去低洼处高度,宽度可由下标计算,则该低洼处面积可得。若栈空 或没有遇到上升时,将柱子下标入栈。
动态规划。
遍历各柱子高度,找到 i 位置左边最高柱子的高度 以及右边最高柱子的高度,存储于 maxLeft 和 maxRight 数组,即 maxLeft[i] = max(maxleft[i-1], height[i-1])。再次遍历柱子高度,对于每个下标 i,其宽为1,长为左右最高柱子中较低的高度,再减去 i 处高度。这是按列计算雨水量。
双指针。
维护左右指针分别从左右侧向中间遍历,(while)当左指针小于右指针时,记录左指针左侧最高柱子的高度 leftMax,以及右指针右侧最高柱子的高度 rightMax。若左指针处高度小于右指针处(则可保证 leftMax < rightMax),则计算该列面积,宽为1,高为左指针 左侧最高高度 - 左指针处高度,计算面积后左指针向右移动一位。否则计算右指针处面积,并操作右指针向左移动一位。当左右指针相遇,则面积计算结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值