剑指offr--C/C++
海绵Jemma
这个作者很懒,什么都没留下…
展开
-
【剑指offr--C/C++】JZ32 从上往下打印二叉树
总结:一般深度遍历用递归,层次遍历用队列辅助:从队首取出一个节点,就将它的左右孩子放到队尾,这样依次进行下去,知道最后一个节点被取出来就完成了一次遍历。原创 2024-07-20 18:15:15 · 153 阅读 · 0 评论 -
【剑指offr--C/C++】JZ26 树的子结构
第一个:确定一个根节点,A树中任意一个节点都有可能是子树的根节点,若当前节点不是,那么就要将其左右子树分别作为根节点走相同的判断流程;第二个:选择一个节点之后,将以这个节点为根的整棵树取出来与B进行比较,比较时根节点与左右子节点比较的方式是相同的。要判断一个树是不是另一个树的子树,这里边存在两个递归–所以我们要写两个函数,来完成两个递归。原创 2024-07-20 16:32:08 · 233 阅读 · 0 评论 -
【剑指offr--C/C++】JZ7 重建二叉树
我们可以根据二者的特点结合一下:对于前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}, 根据前序可知1是树的根节点,那么再看中序就可以用1分成左子树{4,7,2}和右子树{5,3,8,6}。再看前序的第二个元素是2,2就是左子树的根节点,于是{4,7}是2的左子树,2没有右子树。以此类推就可以得到一颗完整的树。前序遍历:中、左、右。所以前序遍历的第一个节点是树的根节点,第二个节点是左子树的根节点。中序遍历:左、中、右。树的根节点在中间某处。原创 2024-04-05 19:29:17 · 362 阅读 · 0 评论 -
【剑指offr--C/C++】JZ54 二叉搜索树的第k个节点
/取出栈顶元素,计数器+1,若==k,则返回该节点值。//否则,进入该节点的右子树并重复上述压栈取值操作。//借助辅助栈,依次读取左值并压入栈中,知道最左。//若没有右子树则会继续取出栈顶元素。原创 2024-04-05 17:55:45 · 414 阅读 · 0 评论 -
【剑指offr--C/C++】JZ55 二叉树的深度
每一个节点的深度都=max{左子树深度,右子树深度}+1。//先将root放进去,记录当前这一层的节点个数,//然后依次取出这一层节点并将其左右子节点放进去。求二叉树深度两个思路:递归、层次遍历。//重复上述步骤直到节点遍历完成。//层次遍历:用队列辅助。三、层次遍历思路及代码。原创 2024-04-05 17:06:36 · 225 阅读 · 0 评论 -
【剑指offr--C/C++】JZ59 滑动窗口的最大值
我这里考虑:窗口每次往后移动一位,那么如果当前窗口的最大值max在窗口内部,那么再滑动到下一个窗口的时候,窗口内只有最新进来的一个元素没有跟max做过比较,只需要让他俩比较一下即可。通过这种方式能比暴力比较节省一点时间。暴力解法是依次往后滑动一位,然后比较窗口内的值。原创 2024-04-04 19:17:09 · 365 阅读 · 0 评论 -
【剑指offr--C/C++】JZ73 翻转单词序列
①遍历字符串,通过空格来确定单词。③依次出栈组成新的字符串。②将单词和空格依次入栈。原创 2024-04-04 18:24:40 · 210 阅读 · 0 评论 -
【剑指offr--C/C++】JZ31 栈的压入、弹出序列
③如果相同就不用入栈了(不入栈=出栈),然后再依次取出栈的栈顶元素看是否与出栈数组当前值相同,相同的话就依次出栈,知道不再相等或者全部出栈;①在入栈之前先判断当前要入栈的元素是否与出栈数组当前元素相同,④若入栈元素还没有遍历完,就继续重复前三个步骤。借助一个辅助栈来模拟入栈过程,② 如果不相同就入栈;原创 2024-04-04 17:58:00 · 340 阅读 · 0 评论 -
【剑指offr--C/C++】JZ30 包含min函数的栈
step 3:每次push元素的时候与第二个栈的栈顶元素比较,若是较小,则进入第二个栈,若是较大,则第二个栈的栈顶元素再次入栈,因为即便加了一个元素,它依然是最小值。于是,每次访问最小值即访问第二个栈的栈顶。可以利用双栈来完成寻找最小值的操作,从stack1中依次取出元素放到stack2并记录最小值,这样元素全部取出后最小值旧得到了,再把元素依次放回到stack1中即可。step 1:使用一个栈记录进入栈的元素,正常进行push、pop、top操作。step 2:使用另一个栈记录每次push进入的最小值。原创 2024-04-04 16:36:38 · 331 阅读 · 0 评论 -
【剑指offr--C/C++】JZ9 用两个栈实现队列
栈是先进后出,队列是先进先出,也就是说从push角度来说二者顺序相同,而从pop的角度来说二者顺序正好是相反的,那我们就可以一个栈中push,一个栈中pop。在一个stack1中进行push,然后每当需要pop的时候就将stack1中的元素依次取出放到stack2中,那么正好stack2的顺序就与队列相同了,从stack2取出栈顶元素,取完以后再把元素都放回stack1。原创 2024-04-04 16:16:17 · 306 阅读 · 0 评论 -
【剑指offr--C/C++】JZ22 链表中倒数最后k个结点
法2:设置前后两个指针,先让一个指针走k步的距离为k(如果这个过程中已经走到链表末尾,那么直接返回空),然后同步进行遍历,这样等前面的指针走到结尾的时候,后面的指针正好是倒数第k个节点。法1:先遍历一遍获取size ,在遍历一遍获取第(size-k)个节点返回。遍历链表并存入vector容器,通过下标取出对应位置元素或者返回空。原创 2024-03-26 22:03:45 · 277 阅读 · 0 评论 -
【剑指offr--C/C++】JZ23 链表中环的入口结点 与哈希表
unordered_set是一种无序的数据集合容器,元素和键同时存在,元素没有按任何特定的顺序排序,而是根据它们的散列(hash)值组织成桶,以允许直接通过值快速访问各个元素(平均时间复杂度是O(1))。一、哈希表(unordered_set)知识点。原创 2024-03-26 21:40:37 · 351 阅读 · 0 评论 -
【剑指offer--C/C++】JZ25 合并两个排序的链表
我这里是设置将两个链表拆开组成一个新的链表,这样不需要占用新的空间。两个指针对应节点的值进行比较,那个节点值较小,就将这个节点拿下来放到新链表的末尾(想象拆两条手链),另一个链表不动,这样一轮下来就能按大小顺序将节点依次拆开组成一个新的链表。我上面的pHead3==NULL部分的逻辑是为了通过比较来获取链表的第一个元素,因为第一个元素跟后面的不一样,不能统一用next。只需要返回的时候再把添加的这个表头去掉就可以了,很妙,记录一下。原创 2024-03-17 18:20:39 · 762 阅读 · 0 评论 -
【剑指offer--C/C++】JZ24 反转链表
三个指针,分别指向:当前节点、前一个节点、后一个节点。通过指针的辅助使得当前节点的next指向前一个节点,这样遍历完一遍之后所有的next全部翻转指向其前一个节点。遍历一轮,将节点依次压入栈,然后从栈顶依次取出节点,并另上一次取出节点的next指向当前取出的节点,最后记得将最后一个节点的nxet指向NULL。原创 2024-03-17 17:07:44 · 592 阅读 · 0 评论 -
【剑指offer--C/C++】JZ6 从尾到头打印链表
先遍历链表,以此存到vector中,然后定义两个指针,分别从头部和尾部同时往中间遍历,并将相应的位置进行交换,直到两个指针相等或后面的指针小于前面的。例如{1,2,3,4,5} --> 1和5交换,2和4交换。在函数外部声明, 即把ret声明为Solution类的一个公有变量. 从而函数每次直接调用ret执行操作即可, 不需要在每一层递归都声明一个新的ret.先遍历链表,以此存到vector中,然后再从后往前遍历这vector,存入到一个新的vector,就完成了翻转操作。原创 2024-03-07 20:04:19 · 447 阅读 · 0 评论 -
【剑指offer--C/C++】JZ3 数组中重复的数字
这道题目它要求的时间空间利用率都是n,那么可以考虑创建一个长度为n的数组repeat初始化为0,下标代码出现的数字,下标对应的数组内容代表该下标数字出现的次数。然后遍历提供的数组,每出现一个数字,就去repeat数组下标对应位置内容+1,然后判断如果已经>1了,那说明重复了,直接返回这个下标数字即可。编译报错说是numbersLen是一个会变的数字,不能用它作为数组长度,可是,当运行到这个子函数内部并创建数组的时候,numbersLen不是一个已知的且在子函数退出之前固定不变的数吗?原创 2024-03-03 22:22:37 · 428 阅读 · 0 评论