- 博客(20)
- 问答 (1)
- 收藏
- 关注
原创 代码随想录训练营day23|39. 组合总和,40.组合总和II,131.分割回文串
要求:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的同一个数字可以无限制重复被选取。因为可以不停的用一个数字,所以在单层递归时不用传入i+1,继续传入i就好。
2024-08-15 21:10:16
476
原创 代码随想录训练营day22|77题. 组合,39. 组合总和,17.电话号码的字母组合
如果是求两两的组合。三个的组合可以再套一层for循环,但是面对求k个组合时,不停的写for循环就太麻烦了。考虑借用递归来解决for循环的嵌套,k个for循环就是递归k层,终止条件就是组合中有k个数。对于二叉树来说,横向只用取root->left和root->right,纵向用递归解决。而现在是一个n叉树,所以用for循环从左往右取,纵向仍然用递归解决.
2024-08-15 14:04:26
172
原创 代码随想录训练营day21|669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树
如果一个当前节点<low,那应该去查找它的右子树,并返回修建后的右子树;如果>high,那应该去看它的左子树怎么样,返回修建后的左子树。
2024-08-14 14:30:32
372
原创 代码随想录训练营day20|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点
根据二叉搜索树的特性,它的公共祖先肯定是值夹在p和q之间的(满足此条件的第一个点)
2024-08-14 13:59:31
325
原创 代码随想录day18|530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先
和验证二叉搜索树的思路一样,用双指针。然后再设个int min=INT_MAX;当(root->val-pre->val)<min时更新min用中序遍历。
2024-08-14 00:05:24
443
原创 代码随想录训练营day17|654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树
其实这题和用中序+后序构建二叉树是一样的。找到最大值后将它的左右分为两个数组,然后分别放入root->left和root->right;
2024-08-13 14:32:47
243
原创 代码随想录day16|513.找树左下角的值,112. 路径总和,106.从中序与后序遍历序列构造二叉树
所以中间的节点就是后序的最后一位,因为没有重复的,所以可以根据postorder.back(),找到中序中对应值的下标,将前后分为两段中序,再根据其大小建立两段后序。需要记录用一个当前深度和最大深度,只有当深度>最大深度时更新result,这样同层不会处理第一个后面的数,任意遍历顺序都可,因为左都在右之前。注意这样传入root的引用,不用引用只是赋值拷贝,对传入的数据本身没有影响,root->left在函数外还是NULL;而当要记录所有路径和==目标值的路径时,用void即可。该问题是找到一条符合的路径。
2024-08-11 19:46:38
251
原创 代码随想录day15|222.完全二叉树的节点数,110.平衡二叉树,257. 二叉树的所有路径
直接用递归的方式求完全二叉树是可以的,但这样就等于把它当成了普通二叉树,没有利用到二叉树的特性,也就是只有最下面一层是不满的,而且从左到右连续。如果能确定左子树是否为满二叉树,则可以利用pow(2,depth)-1直接求出数量。可以利用一直向左遍历的深度和一直向右遍历的深度来判断是否是满二叉树,因为根据完全二叉树的性质,如果深度一样那中间必有节点。
2024-08-10 22:20:08
534
原创 代码训练营day14|226.翻转二叉树,101. 对称二叉树,104.二叉树的最大深度,111.二叉树的最小深度
对于根节点,只用将它的左右子节点翻转就行。其余节点也是,只要依次翻转每个节点的左右节点就行如果先处理根节点的左右节点,则是前序遍历。将swap放到最后,则是最后处理根节点,为后序遍历。但不能是中序遍历,不然处理会有重复。也可以用迭代来完成。
2024-08-08 16:42:38
241
原创 代码随想录训练营day13|二叉树理论基础,二叉树的递归,以及迭代
深度:层数满二叉树:全满,有2^(k-1)个节点。完全二叉树:只有最下面一层没填慢,而且那一层从左往右有节点的地方连续。二叉搜索树:左子树上节点均小于根节点,右子树均大于。平衡二叉搜索树:AVL,左右深度差小于等于1.
2024-08-07 20:31:52
531
原创 代码训练营第十一天|150. 逆波兰表达式求值,239. 滑动窗口最大值,347.前K个高频元素
堆是完全二叉树(只有最后一行可以不被填满,不能没有左子树),每个父节点都不小于子节点(大顶堆)或都不大于子节点(小顶堆)。当i和j同在窗口中时,j大,如果j在i的右边,那有j出现时i一定不可能是最大值,所以i已经可以移除掉。取个极端情况,假如我只用1个,那么第一次弹出,那么我会弹出许多个k,这样还要把全部都排一遍才能确定。统计元素出现频率,可以用哈希表中的map,key是元素,value为频率。而当前面弹出的元素和j相同时,说明j已经不在窗口中,可以弹出。如果用大顶堆的话,那么每次弹出时将会把最大的弹出,
2024-08-06 18:32:45
271
原创 代码随想录训练营day10|栈和队列,232.用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串中的所有相邻重复项
stack < 储存的类型 > 容器名在缺省时默认用deque实现栈,deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑了。其他实现方法还有vector(顺序栈)和list(链栈)规定链栈没有虚拟头节点,head直接指向栈顶,// 分配新的结点");// 将当前的栈顶元素赋值给新节点的直接后继top = p;// 将新的结点赋值给栈顶指针count++;return OK;
2024-07-30 16:13:56
546
原创 代码随想录训练营day9|151.翻转字符串里的单词,右旋字符串,28. 实现 strStr(),459.重复的子字符串
前缀aa 和后缀aa相同,则省去了模式串前缀he文本串b前面aa对比的必要,直接让模式串的j指向前缀的下一个字母b,跳过之前已经匹配过的地方。传统暴力算法遇到不满足的比如在ababad中查找abad,当遇到第四个字母与查找字母d不等时,再从第二个字母开始一一对照。而KMP算法分析前后缀,因为如果在查找模式串第n个字母时发现不对应,则至少前面都是一一对应的,如果有前缀和后缀相同。找到最长相等前后缀,如果一个字符串有子串,则它的最长相等前后缀不包含的地方则是最小子串。但这样比较麻烦,而且要申请新的空间。
2024-07-30 10:24:03
393
原创 代码随想录训练营day8|344.反转字符串,541. 反转字符串II,替换数字
用双指针,从后往前,遍历到数字时填充number。可以用两个指针,分别放在左右两边,移动交换。要求:将数组中所以数字字符换成number。另外一种就是直接用reverse函数。正着遍历也行,但需要创建一个新数组。翻转的时候是左闭右开的区间。1.指定字符及其个数初始化。
2024-07-29 00:52:45
277
原创 代码随想录训练营day7|454.四数相加II,15. 三数之和,18. 四数之和
将数组两两分组,把两组数组的元素相加有多少情况算出来,可以用map来记录,然后查找target-sum是否在map中出现过。思路:固定一个数,剩下两个数依次查找他们的和看与固定过的是否相加等于target。探索半天后只能在最前面判断nums.size()<4,小于的话直接return。和三数之和是一样的,只是再嵌套了一层循环。当我其他不改动,只是边界写成这样时,测试数组[0]会出现越界的问题,为了避免重复查找可以排序。然后在剩下两组计算时查找。
2024-07-28 22:59:00
219
原创 代码随想录训练营day6|哈希表:242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
将关键值key通过某种方式(哈希函数)映射为在哈希表上的位置。
2024-07-23 19:35:18
414
原创 代码随想录训练营第四天|24.两两交换链表中的节点,19.删除链表的倒数第N个节点,链表相交,142.环形链表2
用了一个一次移动两个位置的快指针和一个正常移动的慢指针来判断是否是环形,如果不是环形两者不可能相交。让相遇点index2和头结点处的index1同时出发,则在入口处相遇。如果m短n长,那只用比较n的后m位,所以要先用一个指针来移动,n>1时,则转了n-1圈再走z后会和index1处在入口相遇。和翻转链表的其实差不多,找到要交换的两个节点的前一位,然后。慢指针(x+y)*2=x+y+(z+y)*n,n必然>=1。链表相交也是同样的思路,先分别获得长度m与n,n=1时,说明x=z。
2024-07-23 11:17:54
202
原创 代码随想录训练营第三天|203.移除链表元素,707.设计链表,206.翻转链表
一次运行中初始化的时候没有给head赋值为NULL,导致其成为野指针报错;在里面定义临时指针temp,想着用完了及时处理掉,但忽略了temp。指向的内存也是cur指向的,所以会有指针悬空的报错。删除目标节点的方式一般为找到它的前一个节点,1.直接对头节点进行操作。
2024-07-20 23:13:05
331
原创 代码随想录训练营第一天|Leecode704.二分查找,(35,34扩展),Leecode27.移除元素
要删除3时,最后i=2时,会是2,2,3,(3);最后left与right相邻时,(1,2],middle会取到left,而left又等于middle,陷入了死循环。但取到的1并不是最右边的1,所以找右边界时,middle=target时,更新左边界=middle+1。因为有可能middle第一次就取到和目标值相等,eg{0,1,1,1,1,1,1,1,1,8};本来这不难的,但我在一个地方卡住了很久,就是while循环那里,当给的是3,2,2,3。l=middle+1,指向第一个比目标值大的元素的下标。
2024-07-17 15:22:09
575
空空如也
关于C++for循环的一些
2024-02-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人