
数据结构刷题总结
数据结构刷题总结
Lasonas
这个作者很懒,什么都没留下…
展开
-
分红酒(有4个红酒瓶子,它们的容量分别是:9升, 7升, 4升, 2升 开始的状态是 [9,0,0,0],也就是说:第一个瓶子满着,其它的都空着)
分红酒有4个红酒瓶子,它们的容量分别是:9升, 7升, 4升, 2升开始的状态是 [9,0,0,0],也就是说:第一个瓶子满着,其它的都空着。允许把酒从一个瓶子倒入另一个瓶子,但只能把一个瓶子倒满或把一个瓶子倒空,不能有中间状态。这样的一次倒酒动作称为1次操作。假设瓶子的容量和初始状态不变,对于给定的目标状态,至少需要多少次操作才能实现?本题就是要求你编程实现最小操作次数的计算。输入:最终状态(逗号分隔)输出:最小操作次数(如无法实现,则输出-1)例如:输入:9,0,0,0应该输出:原创 2020-08-25 09:23:16 · 449 阅读 · 0 评论 -
城市建设(最小生成树与并查集的应用)
题目描述栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修。市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他。C市中有n个比较重要的地点,市长希望这些地点重点被考虑。现在可以修一些道路来连接其中的一些地点,每条道路可以连接其中的两个地点。另外由于C市有一条河从中穿过,也可以在其中的一些地点建设码头,所有建了码头的地点可以通过河道连接。栋栋拿到了允许建设的道路的信息,包括每条可以建设的道路的花费,以及哪些地点可以建设码头和建设码头的花费。市长希望栋栋给出一个方案,使得任意两个原创 2020-08-24 17:54:35 · 331 阅读 · 0 评论 -
leetcode437路径总和III(给定一个二叉树,它的每个结点都存放着一个整数值。 找出路径和等于给定数值的路径总数)
给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。示例:root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8返回 3。和等于 8 的路径有:5 -> 35 -> 2 -> 1-3 -> 1原创 2020-08-22 09:45:41 · 1096 阅读 · 0 评论 -
leetcode1676检查子树(检查子树。你有两棵非常大的二叉树:T1,有几万个节点;T2,有几万个节点。设计一个算法,判断 T2 是否为 T1 的子树)
检查子树。你有两棵非常大的二叉树:T1,有几万个节点;T2,有几万个节点。设计一个算法,判断 T2 是否为 T1 的子树。 如果 T1 有这么一个节点 n,其子树与 T2 一模一样,则 T2 为 T1 的子树,也就是说,从节点 n 处把树砍断,得到的树与 T2 完全相同。示例1:输入:t1 = [1, 2, 3], t2 = [2]输出:true示例2:输入:t1 = [1, null, 2, 4], t2 = [3, 2]输出:false提示:树的节点数目范围为[0, 20000]原创 2020-08-21 09:46:14 · 300 阅读 · 0 评论 -
leetcode1674首个共同祖先(设计并实现一个算法,找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意:这不一定是二叉搜索树)
设计并实现一个算法,找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意:这不一定是二叉搜索树。 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1 的最近公共祖先是节点 3。示例 2:输入: root = [3,5,1,6,2,0,8,null,null原创 2020-08-21 08:16:34 · 878 阅读 · 0 评论 -
leetcode160后继者(设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。 如果指定节点没有对应的“下一个”节点,则返回null)
设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。 如果指定节点没有对应的“下一个”节点,则返回null。示例 1:示例 2: 思路: 首先本题中的二叉树还是个二叉搜索树,也就是中序遍历是单调递增的,所以我们可以利用这个性质来简化查找过程。 如果结点 p 的值大于等于 root 的值,说明p 的后继结点在 root 右子树中,那么就递归到右子树中查找。 如果结点 p 的值小于 root 的值,说明 p的后继结点有两种可能,要么在左子树中,要么就是 roo原创 2020-08-20 15:56:05 · 446 阅读 · 0 评论 -
leetcode98验证二叉搜索树(给定一个二叉树,判断其是否是一个有效的二叉搜索树)
给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。示例 1:示例 2: 思路:有效的二叉搜索树的中序遍历是一个递增的序列,中序遍历二叉树,在遍历时用一个变量pre来保存当前节点的前一个值(即存放历史序列的最大值),如果接下来遍历的值小于或等于pre,就说明不是有效的二叉搜索树,如果大于pre就用当前值更新pre的值。原创 2020-08-19 18:59:21 · 1303 阅读 · 0 评论 -
leetcode1670特定深度节点链表(给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组)
给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。示例: 思路:使用BFS对二叉树进行层次遍历,每层都使用一个链表来存储。ListNode[ ]中的元素存放着每一层的第一个节点。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *原创 2020-08-19 13:30:13 · 384 阅读 · 0 评论 -
leetcode108将有序数组转换为二叉搜索树(将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1)
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 思路:构造一棵树的过程可以拆分成无数个这样的子问题:构造树的每个节点以及节点之间的关系。对于每个节点来说,都需要:选取节点构造该节点的左子树构造该节点的右子树因题目要求构造一原创 2020-08-19 09:31:56 · 229 阅读 · 2 评论 -
leetcode1671检查平衡性(实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1)
实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。示例 1:示例 2:思路:在求树的高度时就开始判断,只要遇到某个节点的左右子树高度差大于1,就不要继续递归了,可以直接认为整棵树不平衡。 代码实现:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *原创 2020-08-18 19:45:10 · 380 阅读 · 0 评论 -
leetcode129求根到叶子节点数字之和(给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字)
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。示例 1:输入: [1,2,3]输出: 25解释:从根到叶子节点路径 1->2 代表数字 12.从根到叶子节点路径 1->3 代表数字 13.因此,数字总和 = 12 + 13 = 25.示例 2:输入: [4,9,0,5,1]原创 2020-08-18 11:19:39 · 918 阅读 · 0 评论 -
leetcode111 二叉树的最小深度(给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量)
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],返回它的最小深度 2.思路:叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点当 root 节点左右孩子都为空时,返回 1当 root 节点左右孩子有一个为空时,返回不为空的孩子节点的深度当 root 节点左右孩子都不为空时,返回左右孩子较小深度的节点值 代码实现:/*原创 2020-08-16 17:59:49 · 885 阅读 · 0 评论 -
猫狗收容所(有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进,入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进,入收容所)
有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进,入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进,入收容所的。 给定一个操作序列int口[2] ope代表所有事件。 若第一个元素为1,则代表有动物进入收容所,第二个元素为动物的编号,正数代表狗,负数代表猫; 若第一个元素为2,则代表有人收养动物,第二个元素若为0,则采取第一种收养方式(最早),若为1,则指定收养狗,若为-1则指定收养猫。 请按顺序返回收养的序列原创 2020-08-10 08:37:40 · 2036 阅读 · 0 评论 -
将一个栈内的元素排序,只能再使用一个辅助的栈,不能再使用其他数据结构
将一个栈内的元素排序,只能再使用一个辅助的栈,不能再使用其他数据结构import java.util.ArrayList;import java.util.Stack;public class Main { public ArrayList<Integer> solve(int[] arr) { Stack<Integer> source = new Stack<>(); //将数组中的元素存入栈中 f原创 2020-08-09 13:54:53 · 517 阅读 · 0 评论 -
leetcode232用栈实现队列(使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素 )
使用栈实现队列的下列操作:push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2);queue.peek(); // 返回 1queue.pop(); // 返回 1queue.empty(); // 返回 false说明: 你只能使用标准的栈操作 – 也原创 2020-08-09 10:56:52 · 776 阅读 · 0 评论 -
leetcode1649堆盘子(堆盘子。设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为)
ens堆盘子。设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样)。 进阶:实现一个popAt(int index)方法,根据指定的子栈,执行pop操作。...原创 2020-08-08 21:57:14 · 329 阅读 · 0 评论 -
leetcode1648栈的最小值(请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1))
请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin(); --> 返回 -3.minStack.pop();minStack.top(); -->原创 2020-08-07 21:54:52 · 497 阅读 · 0 评论 -
leetcode234回文链表(请判断一个链表是否为回文链表)
请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?思路:可以使用快慢指针和栈的数据结构来解决些题,一开始慢指针slow和快指针fast同时指同第一个节点,然后慢指针每次前进一步,快指针每次前进两步,慢指针前进时把扫过的...原创 2020-08-06 10:55:04 · 284 阅读 · 0 评论 -
leetcode1645环路检测(给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路)
给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。示例 1:输入:head = [3,2,0,-4], pos = 1输出:tail connects to node index 1解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [1,2], pos = 0输出:tail connects to node index 0解释:链表中有一个环,其尾部连接到第一原创 2020-08-05 17:19:56 · 475 阅读 · 0 评论 -
leetcode1642链表求和(给定两个用链表表示的整数,每个节点包含一个数位。 这些数位是反向存放的,也就是个位排在链表首部。 编写函数对这两个整数求和,并用链表形式返回结果)
给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912进阶:假设这些数位是正向存放的,请再做一遍。示例:输入:(6 -> 1 -> 7) +原创 2020-08-05 10:10:07 · 7232 阅读 · 1 评论 -
leetcode86分隔链表(给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前)
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5思路:将链表拆分为两个链表leftHead和rightHead,小于 x 的节点都放在leftHead,大于或等于 x 的节点都放在rightHead,然后将这两个链表连接起来就是答原创 2020-08-03 18:35:27 · 599 阅读 · 2 评论 -
leetcode237删除链表中的节点(请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点)
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。现有一个链表 - - head = [4,5,1,9],它可以表示为:示例 1:输入: head = [4,5,1,9], node = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], node = 1输出: [4,5,9]解释: 给定你链表中值为 1原创 2020-08-03 11:07:18 · 745 阅读 · 0 评论 -
leetcode1666返回倒数第 k 个节点(实现一种算法,找出单向链表中倒数第 k 个节点,返回该节点的值)
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。示例:输入: 1->2->3->4->5 和 k = 2输出: 4说明:给定的 k 保证是有效的。解题思路这是典型的双指针游走题目,设有两个指针 p1,p2 :初始时,两个指针均指向 head。先将p2向后移动 k 次。此时p1,p2的距离为 k。同时移动 p1,p2, 直到 p2 指向null。此时p1.val即为答案。如下图所示:代码/** * Definition for singly-原创 2020-08-03 08:42:46 · 525 阅读 · 0 评论 -
leetcode1661移除重复节点(移除未排序链表中的重复节点,保留最开始出现的节点)
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]示例2:输入:[1, 1, 1, 1, 2]输出:[1, 2]提示:链表长度在[0, 20000]范围内。链表元素在[0, 20000]范围内。进阶:如果不得使用临时缓冲区,该怎么解决? 思路:我们最容易想到的就是用集合去重,从链表的头开始遍历,如果在HashSet集合中有出现重复的元素,我们直接过滤(删除)掉 链表节点定义原创 2020-08-02 23:42:18 · 737 阅读 · 0 评论