算法时间 II

1. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

解题思路:

  1. 使用 「栈」成对匹配括号
  2. 最终栈中还有未出栈的字符则代表非对称

leetcode 提交

2. 最小栈

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

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

解题思路:

  1. 获取到最小元素可以使用一个最小值栈存取最小元素
  2. stack 入栈时,min_stack 入栈最小值
  3. stack 出栈是,min_stack 出栈最小值
  4. 获取最小值时,min_stack 获取当前栈顶元素

leetcode 提交

3. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

解题思路:
通过对边界出入栈的方式遍历计算。
较为复杂,建议查看图解:
解析

leetcode 提交

4. 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。

解题思路:

  1. 新建一个栈
  2. 遍历数组前k位,若新的元素大于栈顶元素,则栈顶元素出栈,最终保留栈底是前k位最大的元素(下标)。
  3. 从第k位开始遍历,新元素大于栈顶元素,则栈顶元素出栈,直到当前元素小于栈顶元素。
  4. 计算栈内的元素最大与最小值(即下标间距)大于k值,则 shift 掉栈底元素,使其符合滑动窗口的要求。窗口内只有 k 个数量的元素。
  5. 将栈底元素存入数组中。在进行下一个窗口的判断。

leetcode 提交

5. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

解题思路:

  1. 确定两个边界之间能装多少水
  2. 当前下标,栈顶,和栈顶的前一个下标,共同组成了一个 凹 型,能盛当前高度与栈顶前一个下标高度中较小值与栈顶高度差的高度 ✖️ 左右下标(即当前下,栈顶前一个下标)的间距(间距需要 - 1)。

leetcode 提交

你可能感兴趣的:(算法时间 II)