1. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
解题思路:
- 使用 「栈」成对匹配括号
- 最终栈中还有未出栈的字符则代表非对称
2. 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
- MinStack() 初始化堆栈对象。
- void push(int val) 将元素val推入堆栈。
- void pop() 删除堆栈顶部的元素。
- int top() 获取堆栈顶部的元素。
- int getMin() 获取堆栈中的最小元素。
解题思路:
- 获取到最小元素可以使用一个最小值栈存取最小元素
- stack 入栈时,min_stack 入栈最小值
- stack 出栈是,min_stack 出栈最小值
- 获取最小值时,min_stack 获取当前栈顶元素
3. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
解题思路:
通过对边界出入栈的方式遍历计算。
较为复杂,建议查看图解:
解析
4. 滑动窗口最大值
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
解题思路:
- 新建一个栈
- 遍历数组前k位,若新的元素大于栈顶元素,则栈顶元素出栈,最终保留栈底是前k位最大的元素(下标)。
- 从第k位开始遍历,新元素大于栈顶元素,则栈顶元素出栈,直到当前元素小于栈顶元素。
- 计算栈内的元素最大与最小值(即下标间距)大于k值,则 shift 掉栈底元素,使其符合滑动窗口的要求。窗口内只有 k 个数量的元素。
- 将栈底元素存入数组中。在进行下一个窗口的判断。
5. 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
解题思路:
- 确定两个边界之间能装多少水
- 当前下标,栈顶,和栈顶的前一个下标,共同组成了一个 凹 型,能盛当前高度与栈顶前一个下标高度中较小值与栈顶高度差的高度 ✖️ 左右下标(即当前下,栈顶前一个下标)的间距(间距需要 - 1)。