栈、队列
栈跟队列相关的题目
Orange&1024
头秃
展开
-
二叉树的三种遍历(使用栈迭代进行实现)
前序遍历非递归: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNo原创 2020-09-23 18:40:01 · 225 阅读 · 0 评论 -
15.查找和最小的K对数字
问题描述 : 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。 找到和最小的 k 对数字 (u1,v1), (u2,v2) … (uk,vk),按从小到大的顺序输出它们的和。 示例 1: 输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3 输出: 因为前三对是:[1,2],[1,4],[1,6],所以输出3,5,7 解释: 返回序列中的前 3 对数: [原创 2020-09-14 20:21:07 · 127 阅读 · 0 评论 -
14.前 K 个高频元素(LeetCode347)
问题描述 : 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 说明: 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 输出时,首先输出频率最高的元素原创 2020-09-14 20:09:20 · 215 阅读 · 0 评论 -
13.任务调度器(LeetCode621)
问题描述 : 给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。 然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。 你需要计算完成所有任务所需要的最短时间。 示例 : 输入:tasks = [“A”,“A”,“A”,“B”原创 2020-09-14 12:10:40 · 96 阅读 · 0 评论 -
12.和至少为 K 的最短子数组(LeetCode862)
问题描述 : 返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 。 如果没有和至少为 K 的非空子数组,返回 -1 。 示例 1: 输入:A = [1], K = 1 输出:1 示例 2: 输入:A = [1,2], K = 4 输出:-1 示例 3: 输入:A = [2,-1,2], K = 3 输出:3 说明: 1 <= A.length <= 50000 -10 ^ 5 <= A[i] <= 10 ^ 5 1 <= K <= 10 ^ 9 输入说明 :原创 2020-09-14 11:10:35 · 112 阅读 · 0 评论 -
11.接雨水(LeetCode42)
问题描述 : 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 可使用以下代码,完成其中的trap函数,其中形参height为上述的柱子高度数组,返回接到的雨水量。 输入说明 : 输入若干个非负整数,以空格分隔。 输出说明 : 输出一个整数原创 2020-09-14 10:47:24 · 95 阅读 · 0 评论 -
10.简化路径
问题描述 : 以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径 请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。原创 2020-09-14 10:33:28 · 154 阅读 · 0 评论 -
9.字符串解码
问题描述 : 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。 示例 1: 输入:s = “3[a]2[bc]” 输出:“aaabcbc” 示例 2: 输原创 2020-09-14 09:35:19 · 135 阅读 · 0 评论 -
8.反转每对括号间的子串
问题描述 : 给出一个字符串 s(仅含有小写英文字母和括号)。 请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。 注意,您的结果中不应 包含任何括号。 示例 1: 输入:s = “(abcd)” 输出:“dcba” 示例 2: 输入:s = “(u(love)i)” 输出:“iloveu” 示例 3: 输入:s = “(ed(et(oc))el)” 输出:“leetcode” 示例 4: 输入:s = “a(bcdefghijkl(mno)p)q” 输出:“apmnolkjih原创 2020-09-14 09:18:14 · 147 阅读 · 0 评论 -
7.使括号有效的最少添加
问题描述 : 给定一个由 ‘(’ 和 ‘)’ 括号组成的字符串 S,我们需要添加最少的括号( ‘(’ 或是 ‘)’,可以在任何位置),以使得到的括号字符串有效。 从形式上讲,只有满足下面几点之一,括号字符串才是有效的: 它是一个空字符串,或者 它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者 它可以被写作 (A),其中 A 是有效字符串。 给定一个括号字符串,返回为使结果字符串有效而必须添加的最少括号数。 示例 1: 输入:"())" 输出:1 示例 2: 输入:"((("原创 2020-09-14 08:54:29 · 203 阅读 · 0 评论 -
6.数据流的中位数(LeetCode295)
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() - 返回目前所有元素的中位数。 示例: addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedian()原创 2020-09-13 10:11:14 · 70 阅读 · 0 评论 -
5.数组中第K大的数(LeetCode 215)
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 思路:构造一个K大小的最小堆,当堆中元素个数小于k时,新元素直接加入堆中 当堆中元素有k个时,就判断堆顶元素是否小于新元素,如果小于,则将新元素加入堆中 #include<iostream> #includ原创 2020-09-13 09:50:29 · 137 阅读 · 0 评论 -
4.合法的出栈序列
已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈,也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法? 思路: 1.用队列存储出栈序列 2.按元素顺序,将元素push到栈中 3.每push一个元素,就检查其是否和队列头部元素相同,相同的话就弹出栈顶,队首元素,直到两个元素不相同为止。 4.如果最后栈中元素为空,则序列合法,否则不合法 #include<iostream> #include<queue> #include<stac原创 2020-09-13 09:25:28 · 968 阅读 · 0 评论 -
3.包含min函数的栈(LeetCode155)
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。 示例: 输入: [“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,原创 2020-09-13 09:12:42 · 94 阅读 · 0 评论 -
2.利用栈实现队列(LeetCode232)
使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 示例: MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false 说明: 你只能使用标准的栈操作 – 也就是原创 2020-09-13 09:04:49 · 64 阅读 · 0 评论 -
1.使用队列实现栈(LeetCode225)
使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 注意: 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。 你可以假设所有操作都是有效的(例如, 对一个空的栈不原创 2020-09-13 08:57:41 · 82 阅读 · 0 评论