随笔分类 - 数据结构与算法
摘要:这道题给我们n+1个数,所有的数都在[1, n]区域内,首先让证明必定会有一个重复数,题目要求不能改变原数组,即不能给原数组排序,又不能用多余空间,那么hash的就不用考虑了,又要求时间小于O(n^2),只能考虑用二分搜索法了,在区间[1, n]中搜索,首先求出中点mid,然后遍历整个数组,统计所有小于等于mid的数的个数,如果个数小于等于mid,则说明重复值在[mid+1, n]之间,反之,重复值在[1, mid-1]之间,然后依次类推,直到搜索完成,此时的low就是我们要求的重复值。
阅读全文
摘要:
思路1:n & 1如果为1,ans=ans+1,然后再n向右移一位,直到n=0,返回ans。注意:因为是Java实现所以要用for
思路2:先判断如果n!=0,ans++,令n = n&(n-1),循环直到n=0,返回ans
阅读全文
思路1:n & 1如果为1,ans=ans+1,然后再n向右移一位,直到n=0,返回ans。注意:因为是Java实现所以要用for
思路2:先判断如果n!=0,ans++,令n = n&(n-1),循环直到n=0,返回ans
阅读全文
摘要:
sortfind,整个数组排序O(NlogN),以示例1为例,先排序为[-4, -1, -1, 0, 1, 2],定义一个a遍历,再遍历求b,c,此时令b等于a接下来的第一个元素,c为最后一个元素,判断a+b+c<0时令b+1,如果a+b+c>0时令c-1.
阅读全文
sortfind,整个数组排序O(NlogN),以示例1为例,先排序为[-4, -1, -1, 0, 1, 2],定义一个a遍历,再遍历求b,c,此时令b等于a接下来的第一个元素,c为最后一个元素,判断a+b+c<0时令b+1,如果a+b+c>0时令c-1.
阅读全文
摘要:
这道题让我们删除二叉搜索树中的一个节点,难点在于删除完节点并补上那个节点的位置后还应该是一棵二叉搜索树。被删除掉的节点位置,不一定是由其左右节点补上,
阅读全文
这道题让我们删除二叉搜索树中的一个节点,难点在于删除完节点并补上那个节点的位置后还应该是一棵二叉搜索树。被删除掉的节点位置,不一定是由其左右节点补上,
阅读全文
摘要:
这道题有个限制在常数时间范围内实现插入删除和获得随机数操作,没有该限制的话直接用一个HashSet就可以搞定。我们利用一个可变list和一个HashMap,其中list用来保存数字,HashMap用来建立每个数字和其在list中的位置之间的映射。重点在于删除元素的逻辑,如果要删除的元素不存在返回false,如果存在,先求出该元素在list中的索引,将list中最后一个元素更新到此位置,同时更新该元素中在hashmap的索引,然后list中删除最后一个元素,hashmap也删除要删除的元素 。
阅读全文
这道题有个限制在常数时间范围内实现插入删除和获得随机数操作,没有该限制的话直接用一个HashSet就可以搞定。我们利用一个可变list和一个HashMap,其中list用来保存数字,HashMap用来建立每个数字和其在list中的位置之间的映射。重点在于删除元素的逻辑,如果要删除的元素不存在返回false,如果存在,先求出该元素在list中的索引,将list中最后一个元素更新到此位置,同时更新该元素中在hashmap的索引,然后list中删除最后一个元素,hashmap也删除要删除的元素 。
阅读全文
摘要:
LRU是Least Recently Used的简写,是最近最少使用的意思。
这个缓存器主要实现两个方法,get和put。我们用List来存储缓存数据,用map来存储key与value的映射,
实现get时,通过map取出当前值,并在list中将该值置为第1个
实现put时,分2种情况,第1种缓存
阅读全文
LRU是Least Recently Used的简写,是最近最少使用的意思。
这个缓存器主要实现两个方法,get和put。我们用List来存储缓存数据,用map来存储key与value的映射,
实现get时,通过map取出当前值,并在list中将该值置为第1个
实现put时,分2种情况,第1种缓存
阅读全文
摘要:
这道题关注与不同值之间的关系,有两个限制条件,两个数字的坐标差不能大于k,值差不能大于t。还是用map结构来记录值和下标的映射。这里定义两上变量i和j,开始都指向0,然后i开始向右遍历数组,如果i和j之差大于k,且map中有nums[j],则删除并j+1,这样保证了map中所有的数的下标之差都不大于k,然后我们检查如果有值差小于等于则返回true。遍历最后返回false。
阅读全文
这道题关注与不同值之间的关系,有两个限制条件,两个数字的坐标差不能大于k,值差不能大于t。还是用map结构来记录值和下标的映射。这里定义两上变量i和j,开始都指向0,然后i开始向右遍历数组,如果i和j之差大于k,且map中有nums[j],则删除并j+1,这样保证了map中所有的数的下标之差都不大于k,然后我们检查如果有值差小于等于则返回true。遍历最后返回false。
阅读全文
摘要:
本来要刷210.存在重复元素III的,发现上一题就是II,于是就先刷这题了。这道题限制了数组中只许有一组重复的数字,而且其坐标差不能超过k。用map来解决,定义一个map,来记录每个数字和其坐标的映射,然后遍历这个数组,判断map中是否存在当前数的坐标,如果存在判断已存在的坐标对应的数与当前数的差是否超过k。
阅读全文
本来要刷210.存在重复元素III的,发现上一题就是II,于是就先刷这题了。这道题限制了数组中只许有一组重复的数字,而且其坐标差不能超过k。用map来解决,定义一个map,来记录每个数字和其坐标的映射,然后遍历这个数组,判断map中是否存在当前数的坐标,如果存在判断已存在的坐标对应的数与当前数的差是否超过k。
阅读全文
摘要:
利用队列和广度优先搜索,我们可以对未染色的节点进行染色,并且检查是否有颜色相同的相邻节点存在,在代码中我们用0表示未检查的节点,用1和2表示两种不同的颜色
阅读全文
利用队列和广度优先搜索,我们可以对未染色的节点进行染色,并且检查是否有颜色相同的相邻节点存在,在代码中我们用0表示未检查的节点,用1和2表示两种不同的颜色
阅读全文
摘要:
这是 二叉搜索树的最近公共祖先 这题的衍生题,这道题是普通的二叉树,不是二叉搜索树,所以就不能利其特有的性质,只能在二叉树中来搜索p和q,然后从路径中找到最后一个相同的节点即为父节点,可以用递归来实现,在递归函数中,首先看当前节点是否为空,若为空则直接返回空;若为p或q中的任一个,也直接返回当着节点;否则的话就对其左右子节点分别调用递归函数。
阅读全文
这是 二叉搜索树的最近公共祖先 这题的衍生题,这道题是普通的二叉树,不是二叉搜索树,所以就不能利其特有的性质,只能在二叉树中来搜索p和q,然后从路径中找到最后一个相同的节点即为父节点,可以用递归来实现,在递归函数中,首先看当前节点是否为空,若为空则直接返回空;若为p或q中的任一个,也直接返回当着节点;否则的话就对其左右子节点分别调用递归函数。
阅读全文
摘要:
分析一下用非递归方法的思路:跟前序、中序、层序一样都要用到栈,后序的顺序是左 右 根,所以当一个节点值被取出来时,它的左右子节点要么不存在,要么已经被访问过了。先将根结点压入栈,然后定义一个辅助结点 head,while 循环的条件是栈不为空,在循环中,首先将栈顶结点t取出来,如果栈顶结点没有左右子结点,或者其左子结点是 head,或者其右子结点是 head 的情况下。
阅读全文
分析一下用非递归方法的思路:跟前序、中序、层序一样都要用到栈,后序的顺序是左 右 根,所以当一个节点值被取出来时,它的左右子节点要么不存在,要么已经被访问过了。先将根结点压入栈,然后定义一个辅助结点 head,while 循环的条件是栈不为空,在循环中,首先将栈顶结点t取出来,如果栈顶结点没有左右子结点,或者其左子结点是 head,或者其右子结点是 head 的情况下。
阅读全文
摘要:
二叉树的中序遍历顺序为左 根 右,可以用递归和非递归来解。递归解法十分直接,对左了节点调用递归函数,根节点访问值,右子节点再调用递归函数。
非递归有两种方法,一种使用栈:从根节点开始,先将根节点压入栈,然后再将其所有左节点压入栈,然后取出栈顶节点,保存节点值,再将当前指针移到其右子节点上,若存在右子节点,则在下次循环时又可将其所有左子节点压入栈中,这样就保证了访问顺序为左 根 右。
阅读全文
二叉树的中序遍历顺序为左 根 右,可以用递归和非递归来解。递归解法十分直接,对左了节点调用递归函数,根节点访问值,右子节点再调用递归函数。
非递归有两种方法,一种使用栈:从根节点开始,先将根节点压入栈,然后再将其所有左节点压入栈,然后取出栈顶节点,保存节点值,再将当前指针移到其右子节点上,若存在右子节点,则在下次循环时又可将其所有左子节点压入栈中,这样就保证了访问顺序为左 根 右。
阅读全文
摘要:
要求从中序和后序遍历的结果来重新建原二叉树,中序遍历顺序是左 根 右,后序遍历顺序是左 右 根,对于这种树的重建一般采用递归来做,由于后序的顺序的最后一个肯定是根,所以原二叉树的根节点可以知道
阅读全文
要求从中序和后序遍历的结果来重新建原二叉树,中序遍历顺序是左 根 右,后序遍历顺序是左 右 根,对于这种树的重建一般采用递归来做,由于后序的顺序的最后一个肯定是根,所以原二叉树的根节点可以知道
阅读全文
摘要:
先序遍历顺序是根左右,后序遍历顺序是 左右根,要建立树,肯定要从根节点开始创建,然后再创建左右子节点,根据先序和后序的特点,根节点的位置是固定的,即是先序遍历的第一个,又是后序遍历的最后一个,知道了根节点位置,我们需要分隔左右子树的区间。
阅读全文
先序遍历顺序是根左右,后序遍历顺序是 左右根,要建立树,肯定要从根节点开始创建,然后再创建左右子节点,根据先序和后序的特点,根节点的位置是固定的,即是先序遍历的第一个,又是后序遍历的最后一个,知道了根节点位置,我们需要分隔左右子树的区间。
阅读全文
摘要:
这道题给我们一棵二叉搜索树,让我们求任意个节点值之间的最小绝对差。由于BST的左<根<右的性质可知,如果按照中序遍历会得到一个有序数组,那么最小绝对差肯定在相信的两个节点值之之间产生。
阅读全文
这道题给我们一棵二叉搜索树,让我们求任意个节点值之间的最小绝对差。由于BST的左<根<右的性质可知,如果按照中序遍历会得到一个有序数组,那么最小绝对差肯定在相信的两个节点值之之间产生。
阅读全文
摘要:
求二叉树的最小共同父节点,可以用递归来求解,同志二叉搜索树的特点是左 < 根 < 右,所以根节点的值一直都是中间值,大于左子树的所有节点值,小于右子树的所有节点值,我们可以做如下判断,如果根节点的值大于 p 和 q 之间的较大值,说明 q 和 q 都在左子树中,那么此时我们就进入根节点的左子节点继续 uxjv,如果根节点小于 p 和 q 之间的较小值,说明 p 和 q 都在右子树中
阅读全文
求二叉树的最小共同父节点,可以用递归来求解,同志二叉搜索树的特点是左 < 根 < 右,所以根节点的值一直都是中间值,大于左子树的所有节点值,小于右子树的所有节点值,我们可以做如下判断,如果根节点的值大于 p 和 q 之间的较大值,说明 q 和 q 都在左子树中,那么此时我们就进入根节点的左子节点继续 uxjv,如果根节点小于 p 和 q 之间的较小值,说明 p 和 q 都在右子树中
阅读全文
摘要:
可以将中序遍历左根右的顺序逆过来,变成右根左的顺序,这样可以反向计算累加和sum,同时更新节点值。
阅读全文
可以将中序遍历左根右的顺序逆过来,变成右根左的顺序,这样可以反向计算累加和sum,同时更新节点值。
阅读全文
摘要:
求二叉树的最左下树节点的值,也就是最后一行左数第一个值,可以用先序遍历来做,维护一个最大尝试和该尝试的节点值,由于先序遍历遍历的顺序是根左右,所以每一行最左边的节点肯定最先先遍历到,由于是新一行,那么当前尝试肯定比之前的最大深度大,所以可以更新最大深度为当前深度,节点值res为当前节点值,这样在遍历到该行其他节点时就不会更新res了
阅读全文
求二叉树的最左下树节点的值,也就是最后一行左数第一个值,可以用先序遍历来做,维护一个最大尝试和该尝试的节点值,由于先序遍历遍历的顺序是根左右,所以每一行最左边的节点肯定最先先遍历到,由于是新一行,那么当前尝试肯定比之前的最大深度大,所以可以更新最大深度为当前深度,节点值res为当前节点值,这样在遍历到该行其他节点时就不会更新res了
阅读全文
摘要:
翻转二叉树是树的基本操作之一,可以使用递归和非递归两种方法。递归方法:交换当前左右节点,并直接调用递归即可。
阅读全文
翻转二叉树是树的基本操作之一,可以使用递归和非递归两种方法。递归方法:交换当前左右节点,并直接调用递归即可。
阅读全文
摘要:
思路1:子树必须是从叶节点开始的,中间部分的不能算是子树,转换一下思路,从root的某个节点开始,就跟subRoot的所有结构都一样,那么问题就转换成了判断两棵树是否相同
阅读全文
思路1:子树必须是从叶节点开始的,中间部分的不能算是子树,转换一下思路,从root的某个节点开始,就跟subRoot的所有结构都一样,那么问题就转换成了判断两棵树是否相同
阅读全文

浙公网安备 33010602011771号