- 博客(19)
- 收藏
- 关注
原创 《算法通关村——位运算常用技巧》
假设有一个int 型数据num,我们要知道这个数据第 i 位是1还是0,我们可以先将 1 左移 i 位,其余位为 0 ,然后我们对 左移后的数 和 num 做 & 运算,若结果为 0 ,则第 i 位为 0 ,否则为 1。先将 v 左移到第 i 个位置,在上一题中,我们得到了只有第 i 位为 0,其余位为1的数,我们将这个数和v左移后的数做 | 运算,便可将第 i 个位置上的数进行更新。同样的,将 1 左移 i 位,其余位为 0 ,再将num 与 左移后的数做 | 运算,这样除了第 i 位,都会变成 0。
2024-01-15 18:31:38 554 1
原创 《算法通关村——二分查找在数组中的作用》
在上一题中,我们是通过数组中元素的左右相邻元素间的大小比较来实现的,而在这题中,我们则通过与nums[right]来进行比较。如果nums[mid] < nums[right],则说明最小值在mid的左侧。相反,则最小值在mid的右侧。首先我们想到的应该遍历一遍数组,根据数组中一个元素与其左右元素的大小关系来寻找,非常简单,但是不符合题目对于时间复杂度的要求,因此我们采用二分查找。如果是在中间缺失的,那么找到第一个缺失的即可,否则缺失的就是n。1.Leetcode852山峰数组索引问题,题目要求如下。
2024-01-04 15:45:25 559 1
原创 《算法通关村——透彻理解二分查找》
其次,除法操作需要进行被除数和除数的位数扩展,以确保被除数和除数具有相同的位数。首先,除法操作需要进行被除数和除数的比较,以确定商的符号。如果被除数和除数的符号相同,则商为正数;如果被除数和除数的符号不同,则商为负数。最后,除法操作需要进行一系列的算术运算和移位操作,以计算商和余数。2.如果high和low很大的话,high和low相加可能会溢出,所以我们进一步改进一下。1.在计算机中,除法是非常耗时间的,这是因为除法操作涉及到更复杂的运算和更多的步骤。因此,我们可以采用移位的方法来改善一下。
2023-12-23 15:44:02 147 1
原创 《算法通关村——轻松搞定最大深度问题》
思路:对于3这个节点,我们需要知道左右子树哪颗是最深的,才能继续下去,同样,对于20这个节点,我们需要知道它的左右子树哪个最深,以便进一步的深入。所以我们要getDepth每一个节点的left和root,然后取其Max,再+1即可。给定这样一个图,让我们求他的最大深度。
2023-12-21 14:35:53 141 1
原创 《算法通关村——二叉树里的双指针》
思路:还是运用递归,但在check方法的最后我们要比较的是左边的左孩子和右边的右孩子,或者左边的右孩子和右边的左孩子。思路:运用递归,判断每个根节点或父节点及其左右孩子是否相等。1.判断两棵树是否相等:结构相同,且节点值也相同。1.一个为空,一个不为空,则节点为非空节点。2.都不为空,则节点为两个节点相加。3.都为空,则节点为空。
2023-12-21 13:30:27 119 1
原创 《算法通关村——迭代实现二叉树的前中后遍历》
假设题目给出的树是这样的,那么得到的后序遍历结果应该为95743,若我们将它反转一下,即34759,这就和前序遍历的思路有了一些相似,不过变成了中右左,到时我们再将res反转一下即可。思路:stack是用来存放遍历到的节点的,在本题中,由于是左中右,所以要先遍历到整棵树的最左边的那个节点,再开始将节点的值存入res,并向右遍历。思路:如果有左子树就一直往下找,没了再从下往上向右找。1.迭代法实现前序遍历。2.迭代法实现中序遍历。3.迭代法实现后序遍历。
2023-12-18 15:03:24 121 1
原创 《算法通关村——原来如此简单》
思路:基于上一题的代码,我们知道queue队列的最后一个输出节点一定是每一行的右边的那个节点,所以我们在将节点输入queue的时候,可以先输入右边的节点。思路:从上往下,从左往右遍历二叉树的每一个元素,每遍历到一个父节点,将其左右孩子压入队列,直到队列为空。思路:由于最后的结果是与上题相反的,所以用链表的形式比较好,因为这样使用头插法的时间复杂度较低。思路:与上一题几乎没什么不一样,只是做出记录每行最后一个节点这一个改动即可。思路:跟之前的题一个区别是要先保存下来每行的值,求一下平均,即可。
2023-12-16 18:09:47 103 1
原创 《算法通关村——理解树的结构》
深度优先遍历又可分为前序遍历、中序遍历、后序遍历(前、中、后都是针对中间的那个节点的)通过树我们得到了前中后三种遍历下的不同结果,那么如何通关得到的结果来画出树呢?我们知道前序是先遍历到中间那个节点的,于是我们对前序和中序进行划分,可得。有关树的基本概念和一些性质,请自行了解,在这不做讲解。深度优先遍历:有节点就往下遍历,遇到叶子节点再返回。有两种常见的方式:深度优先遍历和广度优先遍历。现在我们再试着根据中序和后序来恢复二叉树。我们试一试用前序和中序来恢复二叉树。广度优先遍历:一层一层地遍历。
2023-12-14 15:41:25 106 1
原创 《算法通关村——队列&Hash经典算法》
思路:栈的特点是后进先出,所以在入栈操作时,可使用一个辅助栈Queue2,先将其放入Queue2,再将Queue1中的元素依次放入Queue2中,再两两互换,即可实现。思路:建立一个HashMap,一个for循环来找target-x,若没有则放入HashMap。我们都知道可以两个for循环遍历来找,但这样时间复杂度太高了。思路:使用两个栈,将底部拼在一起,一个用作输出一个用作输入。
2023-12-12 14:57:55 88
原创 《算法通关村——队列和Hash的特征》
完成后的结果就是这样子的,一个索引有可能映射出多个值,我们称之为碰撞。一般有两个方法:开放地址法、链地址法。假设一个数组中存放着1~15这15个数字,现在要存入Hash中,有7个空间,那么我们可以通过一个计算公式来存放。简单说就是将Hash表的每个单元作为一个链表的头节点,有元素要插入时,放到对应链表的尾部即可。我们在计算8的地址时,会发现与1产生冲突,这时可以向后寻找为null的地方,将其存进去。先来用一个例子来解释以下Hash里的映射是如何实现的·。插入的元素的个数不能超过数组长度的75%
2023-12-12 13:36:24 113
原创 《算法通关村——栈的经典问题》
思路:使用一个辅助栈minStack,当一个元素a要入xStack时,将其与minStack栈顶的元素进行比较,比较出的较小值入minStack。再将s遍历,遇到左半边符号则入栈,右半边符号则与栈顶的符号进行比较。一个字符串,只包括(),[],{},三种符号,判断该字符串是否有效,条件是,左括号和右括号以相同的类型闭合,且顺序无误。思路:同样需要另一个栈,并且要压入一个元素时,与maxStack中的元素进行对比,出栈一起出。设计一个栈,支持push,pop,top的操作,时间复杂度为O(1).
2023-12-11 16:14:12 77 1
原创 《算法通关村——如何基于数组/链表实现栈》
我们都知道数组的地址空间是固定的,若要扩容,需重新申请一片空间,再复制过去。同样的,在入栈之前,我们要判断空间是否够用,不用够扩容。假设top只想栈顶元素再上一格位置。链表的操作是根据头节点完成的,所以要初始化头节点head。
2023-12-11 14:39:37 107 1
原创 《算法通过村第三关——白银挑战》
val时,两个指针一起移动,待找到val后,slow不懂,fast接着后移,当num[fast]!= val时,开始移除元素。LeetCode228.给一个数组num{0,1,2,4,5,7},我们可以将其分为三个区间1->2,4->5,7.可见,区间可以有一个或多个元素。一个数组,向右轮转k个位置(k <0),例如num{1,2,3,4,5},k=1,则结果为num{5,1,2,3,4}给一个数组,例如num={0,0,1,1,1,2,2,3,3,4},要求删除重复的元素,但是保留一个。
2023-12-07 16:05:42 54 1
原创 《算法通关村——不简单的数组增删改查》
有两种简单的思路,一是将B弄到A后面,再对整个数组进行排序,二是建立一个新数组C,排好后返回。下面来介绍另一种思路。1.判断一个数组是否单调(对于i<j,num[i]<=num[j]则递增,num[i]>=num[j]则递减),具体代码实现如下。同时我们考虑一种常见的情况:数组为递增数组,那么若遇到>=k的值时就得停下,此时的代码是这样的。插入一个元素无非就是首、尾、中间三个情况,找到待插入点后,将之后元素都向后移,size--数组中的元素是连续的,每个元素占用相同的内存,通过索引来访问元素。
2023-12-07 13:30:40 34 1
原创 《算法通过村第二关之黄金挑战》
先计算出链表长度,共有length/k组,然后每组进行反转,最后未成一组的不动,直接返回头节点即可。问题:一个链表,k个一组反转。
2023-12-05 16:19:52 40
原创 《算法通关村第二关---终于学会链表反转了》
初始情况为ans指向了第一个节点,cur指向了第二个节点。最后返回ans指向的反转后链表的头节点。建立一个虚拟头节点后,依次从原链表上拆下来节点,最终实现反转。建立三个节点,prev ,cur,next。简单分为两类:带虚拟头节点和不带虚拟头节点。
2023-12-04 14:22:47 115
原创 《算法通关村第一关之白银挑战》
思路一:hash表,把第一个链表的元素存在map中,再遍历第二个去对比,找到第一个值相同的节点,具体代码实现如下。思路二:建立两个栈,将两个链表各自压入栈,然后再出栈,等到最后一组节点相等的时候,返回他,具体实现代码如下。问题一·:找到两个链表的第一个公共节点。
2023-11-28 14:09:15 345
原创 《算法通关村第一关---链表青铜挑战笔记》
链表的特点是,每个节点,包含一个值和唯一的指向下一个节点的指针。在JVM中有堆区和栈区,堆区负责记录对象,而栈区负责记录引用,类似于一个指向堆区里对象的地址。于是我们可以这样来建立一个节点的值和指向下一个节点的指针。中间:首先遍历找到插入位置的前一个节点,令为cur,插入节点为nodeInsert,则可以这么操作。2.如果需要向链表中插入一个节点,可分为头部,尾部,中间三种情况。尾部:将最后一个节点原先指为null的指针指向新插入的节点。尾部:遍历找到最后一个节点的前驱节点,将其指针置为null。
2023-11-27 17:34:35 188
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人