Z小偉
这个作者很懒,什么都没留下…
展开
-
求图中岛屿的数量
给定一个“1”(陆地)和“0”(水域)的二维网格地图,计算岛屿的数量。岛屿被水环绕,通过水平或垂直连接相邻的陆地而形成。你可以假设网格的四个边都被水包围着。代码解题思路:遍历图或者数组中的点,如果是岛屿的话,则修改它的值为其它值(非陆地和水),接着递归遍历它的上下左右,直到上下左右都是水或者到了边界则结束。class Island {public: typedef struct tag_coo...原创 2021-12-07 21:52:01 · 143 阅读 · 0 评论 -
开锁问题
你前面有一把锁,有四个轮子。每个轮子有10个槽:“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”。轮子可以自由旋转和环绕:例如,我们可以把’9’变成’0’,或’0’变成’9’。每一步包括转动一个轮子和一个插槽。锁最初从“0000”开始,这是一个表示四个轮子状态的字符串。你会得到一个死锁的列表,这意味着如果锁显示了这些代码中的任何一个,锁的轮子将停止转动,你将无法打开它...原创 2021-12-07 21:52:06 · 377 阅读 · 0 评论 -
二叉树的路径和
给定一棵二叉树和一个和,确定该树是否有根到叶的路径,以便将路径上的所有值相加等于给定的值,这就是路径和。其中的叶指的是叶结点(没有孩子)。代码首先,定义结点信息:struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};...原创 2021-12-10 21:11:41 · 97 阅读 · 0 评论 -
二叉树之对称树
对称树就是基于根结点,左右两边的结点相同,就像照着镜子一样。代码我们来实现判断一颗二叉树是否是对称树,首先定义结点信息:struct TreeNode { char val; TreeNode *left; TreeNode *right; TreeNode(char x) : val(x), left(NULL), right(NULL) {}};以下是迭代版本的对称树判断: bool...原创 2021-12-10 21:12:03 · 149 阅读 · 0 评论 -
计算逆波兰式
逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)。代码解题思路:根据逆波兰式的原理,操作符号都在操作数的后面,由此,我们就可以对逆波兰式数组进行遍历,如果是操作数,则先把操作数压入栈中,当发现操作符时,就可以把操作数出栈,进行相应的运算。以下代码假设传入的数组都是正确的逆波兰式,并且操作符都是有2个操作数的。class RP...原创 2021-12-10 22:44:58 · 172 阅读 · 0 评论 -
最小生成树kruskal算法
介绍最小生成树,就是在一个连通无向图中,每条边都有一个权重w,我们可以找到一个无环的,能将所有顶点连接起来的,并且拥有最小权重的树。kruskal算法就是其中一个计算最小生成树的算法,这个算法中用到了一个数据结构不相交集合。kruskal算法属于贪婪算法,它的主要思想就是,每次选择一条权重最小的边加入到最小生成树集合中。kruskal算法的形象化实现kruskal的实现如下...原创 2021-12-10 21:12:14 · 100 阅读 · 0 评论 -
依据前序、中序和后序确定二叉树
依据前序、中序以及中序、后序可以唯一确定一棵二叉树,但是依据前序、后充不可以唯一确定一棵二叉树。代码struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};根据以上的结点信息,首先来实现中序、后序是如何确定一棵唯一二叉...原创 2021-12-10 21:11:51 · 1302 阅读 · 0 评论 -
二叉树的序列化和反序列化
序列化是将数据结构或对象转换为位序列的过程,以便将其存储在文件或内存缓冲区中,或通过网络连接传输,以便稍后在相同或另一个计算机环境中重新构建。代码struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};二叉树的结点信息...原创 2021-12-10 21:11:27 · 56 阅读 · 0 评论 -
完全平方数
完全平方是指用一个整数乘以自己例如1*1,2*2,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。完全平方数是非负数,而一个完全平方数的项有两个。代码解题思路:把当前的数压入队列,求它的平方根然后对余数继续压入队列。如果余数为0,则表示已经得出了这个数的完全平方数的数量。class PrefectSquare{public: int numSquares(i...原创 2021-12-10 22:50:05 · 816 阅读 · 0 评论 -
二叉树的遍历(迭代、递归)
二叉树的遍历包含3种遍历方式,前序遍历、中序遍历以及后序遍历。代码首先定义相关结点信息,包含左右结点以及值:struct TreeNode { char val; TreeNode *left; TreeNode *right; TreeNode(char x) : val(x), left(NULL), right(NULL) {}};前序遍历就是先遍历根节点,然后遍历左结点,最后遍历...原创 2021-12-10 21:12:10 · 63 阅读 · 0 评论 -
每天的温度
给定一个每日温度T的列表,返回这样一个列表:对于输入中的每一天,它告诉您需要等待多少天,直到温度变暖(后一个值比前一个大)。如果未来没有一天这是可能的,代入0。代码解题思路:反向遍历温度列表,每次把遍历的值和堆顶的值(堆顶存放的是索引值)进行比较,如果大于或者等于堆值,则堆进行出栈操作,直到堆为空或者出现堆顶的值比当前值大,则比较结束,得出结果,并把它的索引值加入堆顶。class Temperat...原创 2021-12-10 22:47:00 · 107 阅读 · 0 评论 -
有效的括号对
给定一个只包含字符'(‘,’)’,'{‘,’}’,'[‘和’]’的字符串,判断输入字符串是否有效。输入字符串在下列情况下有效:开括号必须由相同类型的括号关闭。开括号必须按正确的顺序关闭。注意,空字符串也被认为是有效的。代码这里使用的堆来实现的有效括号对的判断。遍历字符串,当堆为空时,把字符压入堆中,非空时,则判断当前的字符与堆中的字符是否匹配。class Parenthese {public:...原创 2021-12-10 22:47:31 · 122 阅读 · 0 评论 -
图之深度优先搜索算法
图的深度优先搜索算法是一个一条路一直走到黑的算法,只要这条路径还可以找到顶点则就一直找下去,直到找不到顶点时,才沿原路返回,从其它顶点继续查找。深度优先搜索会产生一个深度森林,由几个深度树组成。在查找的过程中,会记录下来每个顶点被发现的时间以及每个顶点沿原路返回时结束的时间。所以一定是开始时间小于结束时间的。首先,先定义出每个顶点和邻接表的属性:#define VERTEX...原创 2021-12-10 21:09:52 · 422 阅读 · 0 评论 -
求二叉树随机两结点的最低公共祖先
在两个节点p和q之间定义的最低公共祖先是T(祖先)中同时具有p和q作为后代的最低节点(在这里,我们允许一个节点作为其自身的后代)。代码最低公共祖先的实现方法: 所有结点都唯一 p和q2个结点都存在struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), ...原创 2021-12-10 21:11:35 · 94 阅读 · 0 评论 -
van Emde Boas tree
介绍van Emde Boas tree是一种适用于0-u数据存储的一种数据类型。它每次根据u的一半来依次递减,直到最后减少到2为止。对数据有一定要求:要求u是2的2k或者2k+1次方。单个结点的结构如下: 每个结点包含以下数据:其中u是当前结点的cluster的数量;min和当前结点中最小结点的数,而且最小值不出来在cluster当中; max是当前结点中最大结点的数;其...原创 2021-12-10 21:12:36 · 100 阅读 · 0 评论 -
单向链表
介绍单向链表是一个线性数据结构。它和数组不同之处就在于它是用指针把所有的结点连接起来,而不是一大块连续内存。实现单向链表的结构比较单一:typedef struct _Node{ int data; struct _Node* next;}Node;typedef struct _List{ Node* head; Node* tail; int length;}List;每...原创 2021-12-10 21:04:33 · 86 阅读 · 0 评论 -
红黑树
介绍红黑树是一种稳定的树,前面说到二叉查找树有些缺点就是,如果是链式插入的话,就会造成树的高度和随机插入的高度相差很大的问题,导致效率低下。而红黑树解决了这个问题,他保证了以下5个特性:1.结点颜色非红即黑。2.根结点颜色一定是黑色的。3.红色结点的孩子颜色一定是黑色的。4.叶子结点的颜色一定是黑色的。5.从任何一结点到叶子结点,中间的黑色结点数量一致。实现定义结构信息如下:typ...原创 2021-12-10 21:12:20 · 94 阅读 · 0 评论 -
二叉查找树
介绍二叉查找树是按二叉树结构来组织的。它的每个结点分为数据域和指针域,数据域包括key值和卫星数据,指针域包括父结点指针,左孩子指针以及右孩子指针。而且,二叉查找树满足特性左孩子的key值<=父结点的key值<=右孩子的Key值。实现二叉查找树的结构如下:typedef struct _Node{ int data; _Node* parent; _Node* ...原创 2021-12-10 21:12:24 · 92 阅读 · 0 评论 -
克隆图
给定连接的无向图中节点的引用,返回图的深度副本(克隆)。图中的每个节点都包含一个val (int)及其邻居的列表(list [node])。代码其中,结点详情信息如下:class Node {public: int val; vector<Node*> neighbors; Node() {} Node(int _val, vector<Node*> _neigh...原创 2021-12-10 22:52:23 · 192 阅读 · 0 评论 -
二叉树的最大深度
许多树的问题可以通过递归来解决,一般的,我们可以自下而下或自下而上递归的解决树的问题。代码首先,先定义树的相关结点信息,包含树的左右节点和节点保存的数据:struct TreeNode { char val; TreeNode *left; TreeNode *right; TreeNode(char x) : val(x), left(NULL), right(NULL) {}}; 以...原创 2021-12-10 21:11:57 · 55 阅读 · 0 评论 -
图之广度优先搜索算法
广度优先算法是很多重要图算法中比较简单的一个,它的主要思想是先从源顶点像四周发散查找,先查找距离源顶点距离为k的所有顶点,然后再查找距离为k+1的所有顶点(k = 1,2,3….)。在广度优先算法中,每个顶点都标色,最初所有顶点都是白色,顶点第一次被发现,则标记为灰色,而黑色标记旁边只能有灰色标记或黑色标记,不能有灰色标记。也就是说一个图以灰黑色逐渐向外扩散。灰色是黑色和白色的隔离...原创 2021-12-10 21:10:14 · 523 阅读 · 0 评论