![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
栈/队列
每天学一点!
时刻保持对知识的热情!
展开
-
150. 逆波兰表达式求值
题目描述 根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例 示例 1: 输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((...原创 2019-11-26 10:50:12 · 161 阅读 · 0 评论 -
42. 接雨水
题目描述 给定n个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。感谢 Marcos 贡献此图。 示例 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 思路 ...原创 2019-08-06 15:55:10 · 78 阅读 · 0 评论 -
32. 最长有效括号
题目描述 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()" 示例 2: 输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()" 思路 通过栈来记录左括号的下标。难点是需要定义个start变量来记录合法括号子串的起始位置。遍历字符串,如果遇到...原创 2019-11-11 09:57:34 · 99 阅读 · 0 评论 -
按之字形顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 思路 层序遍历二叉树只需要一个队列即可。而按照题意,奇数从左到右,偶数层从右到左,则利用一个队列和一个栈来实现。队列先进先出,栈先进后出,所以队列保存奇数层结点,栈保存偶数层结点。由于偶数层是从右到左,所以栈直接从左到右即可。而奇数...原创 2019-05-09 19:09:09 · 94 阅读 · 0 评论 -
leetcode107. 二叉树的层次遍历 II
题目描述 给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 示例 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其自底向上的层次遍历为: [ [15,7], [9,20], [3] ] ...原创 2019-08-08 15:47:21 · 83 阅读 · 0 评论 -
20.有效的括号
题目描述 给定一个只包括'(',')','{','}','[',']'的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 示例 1: 输入: "()[]{}" 输出: true 示例 2: 输入: "(]" 输出: false 示例 3: 输入: "...原创 2018-11-13 21:32:44 · 125 阅读 · 0 评论 -
leetcode496. 下一个更大元素 I
题目描述 给定两个没有重复元素的数组nums1 和nums2,其中nums1是nums2的子集。找到nums1中每个元素在nums2中的下一个比其大的值。 nums1中数字x的下一个更大元素是指x在nums2中对应位置的右边的第一个比x大的元素。如果不存在,对应位置输出-1。 示例 输入: nums1 = [4,1,2], nums2 = [1...原创 2019-08-18 17:52:50 · 151 阅读 · 0 评论 -
101. 对称二叉树
题目描述 给定一个二叉树,检查它是否是镜像对称的。 示例 例如,二叉树[1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个[1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 思路1 DFS。...原创 2019-08-06 20:23:31 · 125 阅读 · 0 评论 -
滑动窗口的最大值
题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,...原创 2019-04-30 09:03:15 · 356 阅读 · 0 评论 -
leetcode103. 二叉树的锯齿形层次遍历
题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 例如: 给定二叉树[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回锯齿形层次遍历如下: [ [3], [20,9], [15,7] ] ...原创 2019-08-08 12:15:03 · 109 阅读 · 0 评论 -
leetcode102. 二叉树的层次遍历
题目描述 给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。 示例 给定二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] 思路 如果只是实现二叉树的层序遍历,用队...原创 2019-08-08 11:10:26 · 92 阅读 · 0 评论 -
包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 思路 用一个栈minStack来更新当前数据的最小值,minStack永远为当前数据的最小值。当删除和插入时,同时更新minStack即可。 具体分析可见我另外一篇博客:https://blog.csdn.net/songsong2017/article/details/...原创 2019-03-04 15:34:42 · 80 阅读 · 0 评论 -
225. 用队列实现栈
题目描述 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作-- 也就是push to back, peek/pop from front, size, 和is empty这些操作是合法的。 你所使用的语言也许不支持队列。你可以使用 l...原创 2019-07-30 07:48:49 · 189 阅读 · 0 评论 -
232. 用栈实现队列
题目描述 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。 思路 两个队列实现栈和两个栈实现队列,思路一模一样。只要push的时候,利用辅助栈或队列将数据倒置即可。 代码 class MyQueue { public: ...原创 2019-07-30 07:59:40 · 134 阅读 · 0 评论 -
155. 最小栈
题目描述 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x)-- 将元素 x 推入栈中。 pop()-- 删除栈顶的元素。 top()-- 获取栈顶元素。 getMin() -- 检索栈中的最小元素。 思路 利用一个辅助栈来记录最小元素,辅助栈的栈顶元素为当前栈的最小元素。也就是当push一个数时,若此数比辅助栈的栈顶元素要小...原创 2019-07-30 08:09:23 · 136 阅读 · 0 评论 -
946. 验证栈序列
题目描述 给定pushed和popped两个序列,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false。 示例 示例 1: 输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 输出:true 解释:我们可以按以下顺序执行: push(1), push(2), pu...原创 2019-07-30 08:35:04 · 211 阅读 · 0 评论 -
224. 基本计算器
题目描述 实现一个基本的计算器来计算一个简单的字符串表达式的值。 字符串表达式可以包含左括号(,右括号),加号+,减号-,非负整数和空格。 示例 示例 1: 输入: "1 + 1" 输出: 2 示例 2: 输入: " 2-1 + 2 " 输出: 3 示例 3: 输入: "(1+(4+5+2)-3)+(6+8)" 输出: 23 说明: 你可以假设所给...原创 2019-07-30 20:25:59 · 136 阅读 · 0 评论 -
215. 数组中的第K个最大元素
题目描述 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 思路 建立一个小根堆,然后这个小根堆的大小一直维持k即可。 代码 c...原创 2019-07-30 20:47:14 · 89 阅读 · 0 评论 -
295. 数据流的中位数
题目描述 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4]的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() - 返回目前所有元素的中位数。 示...原创 2019-07-31 08:12:44 · 115 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 思路 利用一个辅助栈helpStack。遍历压入序列,如第一个值为1,则此...原创 2019-03-09 08:49:34 · 110 阅读 · 0 评论