- 博客(24)
- 收藏
- 关注
原创 代码训练营 Day 27|455.分发饼干 | 376. 摆动序列 | 53. 最大子序和
2. prediff只有在坡度有变化记录一下初始值,后面坡度没有变化prediff没有必要跟着curdiff去变化。3. 如果prediff和curdiff一个正一个负,说明找到了峰值也就是摆动。2. 局部最优: 当连续和为负数,抛弃当前的数字,把下一个数字作为新的起点,重新计算和。3. 除非坡度方向改变了也就是遇到摆动了,从正到负了prediff采取改变。3. 删除单调坡度的元素,这样原序例保证峰值保留,每个峰值都是一个摆动。1. 摆动只有2,只有头跟尾有摆动。2. 数组的两端是默认个有一个摆动的。
2024-09-09 11:30:03
636
原创 代码训练营 Day26 | 47.排序II | 51. N-皇后 |
1. 同一行同一列,45°角度在nxn的棋盘不能出现同个皇后。3. nxn的话就是嵌套n层for循环所以我们要使用回溯。2. 每一层有个for循环遍历每一行(暴力破解想法)1.跟46题一样只不过加一个树层去重。4. 每一行的长度就是数的宽度。
2024-09-08 05:00:38
532
原创 代码训练营 Day25| 90.子集II | 491.递增子序 | 46.全排序
1. 因为startindex是不断递增,当starindex大于等于数组的时候for循环就不会执行也就没有递归了。3. 如果当前元素小于,数组里面右边的那个元素就不能取。0. 记得nums数组一定要先排序!2. 使用used数组标记那个元素使用过了。1. 先取4,剩余从767这里取。3. 每一个节点都是我们要收集的结果。3. 叶子节点返回结果,树层不能重复。2. 有重复元素的一定要想到排序!2. 取7,剩余从67这个取。1. 这道题是不能排序的。2. 4767这个集合取数。1. 排列时强调元素顺序的。
2024-09-07 10:46:34
372
原创 代码训练营 Day24 | 93.复原IP地址 |78.子集
1. startindex就是我们分割线,它控制着下一层递归里面从哪里开始。3. 在子集问题里面每个节点里面就是我们要收集的结果。2. 因为是组合[1,2]和[2,1]是一样的。1. 怎么模拟切割线,如何固定切割线。2. 从那里开始分割线就在那里。1. 这题并不是到叶子节点收获结果。2. 如何去判断子串。
2024-09-06 12:41:15
387
原创 代码训练营 Day23| 39. 组合总和 |40.组合总和II |131.分割回文串
1. 组合没有数量要求2. 元素可无限重复选取0. nums集合要排序,要把相同的元素相邻再一起1. 需要去重,不能出现重复的组合2. 树层去重,树枝去重1. 需要一个变量告诉我们,那个元素我们使用过1. 如果该元素使用过赋值为1,如果没用过就是03. 树层去重1. 前面取过的元素,后面就不能再取了4. 使用used去重的逻辑:遍历到当前节点时,是否还在同一个树枝上,如果不是,则去掉。
2024-09-05 12:26:13
628
原创 代码训练营 Day22 | 回溯算法理论基础 | 77. 组合 |216.组合总和III | 17.电话号码的字母组合
1. 回溯和递归是相辅相成的,只要有递归就会有回溯2. 递归函数的下面的部分就是回溯的逻辑1. 递归结束后向次级函数回退的过程。
2024-09-04 15:34:25
1152
原创 代码训练营Day21 | 669. 修剪二叉搜索树 |108.将有序数组转换为二叉搜索树 | 538.把二叉搜索树转换为累加树
2. 左区间也去选取中间节点,右区间也去选取中间节点,以此类推,这样才能平衡。1. 取靠右侧的节点,取左侧都可以,只要符合二叉搜索树特性就可以。1. root是数组中间位置的元素,这样左区间和右区间元素数量相同。2. 二叉搜索树,中序遍历可以得到一个单调递增的有序数组。1. 把当前节点比他大的这个节点的数值进行累加。1.跟删除节点思路类似(看训练营Day20)3. 这题需要倒过来去对数值进行一个累加。1. 我们可以用遍历顺序 右中左。3. 数组长度为偶数。
2024-09-03 05:01:53
243
原创 代码训练营Day20 | 235. 二叉搜索树的最近公共祖先 | 701.二叉搜索树中的插入操作 | 450.删除二叉搜索树中的节点
1. 递归停止条件:当传递的节点为空时,我们就可以插入新节点了,创建一个值为val的节点并return。1. 如果让右孩子继承父节点位置,让左子树放在继承位置之前右子树的左孩子的下面。1. 遍历根节点的时候,当前遍历的节点比p跟q都大的话,公共祖先在当前遍历节点的左子树里。2. 因为只有这个节点的值是要比父节点大一个数。2. 如果p跟q比当前遍历的节点都小的话,说明在右子树中。3. 如果当前遍历的值在p跟q之间,那么这个就是公共节点。1. 让左右孩子其中一个继承父节点的位置,2. 左不为空,右为空。
2024-09-03 01:40:39
325
原创 代码训练营 Day 18 | 530.二叉搜索树的最小绝对差 | 501.二叉搜索树中的众数 | 236. 二叉树的最近公共祖先
1. 说明maxCount不是最大的了,需要更新整棵树最大的出现频率。2. 并删除之前数组新加入的值,并把当前的元素添加到数组(结果集)2. 通过设置一个最大值的result,通过min函数不断去找到最小的。4. 如果当前元素和之前元素不相等,count重新回归到1。2. 某一个节点左子树是否出现过p右子树是否出现过q。1. 判断左子树返回值不为空,说明出现了p或q。2. 判断右子树返回值不为空,说明出现p或q。1. count 统计单个元素出现的频率。3. 如果count和maxCount相等的话。
2024-08-31 14:37:31
439
原创 代码训练营 Day17 | 654.最大二叉树 | 617.合并二叉树 | 700.二叉搜索树中的搜索 | 98.验证二叉搜索树
2. 右边的递归传参 root1和root2的右边 root1.right root2.right。1. 左边的递归传参 root1和root2的左边 root1.left root2.left。1. 二叉搜索树种,根节点的数值要比左子树里边的所有数值要大,根节点的数值要比右子树的所有数值要小。3. 在对中节点遍历处理条件的时候可以用一个全集变量pre去保存前一个节点值。1. 从左区间找最大的数,作为左子树的父节点。2. 从最大的元素切开,左边是左区间,2. 处理左边和右边的递归调教。
2024-08-30 15:04:52
297
原创 代码训练营 Day16| 513.找左下角的值 | 112.路径总和 | 106.从中序后序遍历构造二叉树
3. 因为通过后序遍历找到了中节点,去中序通过中节点来分割,从而得知那个是左区间节点那个是右区间节点,2. 最左边的值永远是第一个进入队列的,所以在while的内层循环设置一个判断条件即可获得该值。2. 后序遍历的最后一个节点一定是 中间节点,因为后序遍历的顺序是 左右中。4. 通过后序找到中是那个元素,通过中序找到那个是左区间节点和右区间节点。1. 使用递归 前序 中序 后序遍历都可以,以为不涉及中遍历的条件处理。1. 层序遍历是使用队列来分别辨别不同层的元素有那些。1. 后序数组为0,空节点。
2024-08-29 11:31:29
612
原创 代码训练营 Day15 | 110.平衡二叉树 | 257. 二叉树的所有路径 | 404.左叶子之和 | 222.完全二叉树的节点个数
1. 一个容器来收集路径,如何把第一次路径获取的元素弹出,并收集新路径的元素,这个过程就叫做回溯。3. 当我们发现左右任何一个节点,不符合我们这个平衡二叉树的条件,再往上返回的时候就不反回节点高度;1. 除了底层节点,上面都是满的。1. 遍历到父元素之后;判断左孩子是否为空,同时左孩子的左右孩子都为空。3. 根节点可以根据左右子树的数量+1就可以得到完全二叉树的节点数量。2. 那么当前遍历的节点左孩子就是要处理的数据。1. 如果是满二叉树,左右遍历的深度是相等的。2. 一定是父节点的左孩子这样才是左叶子。
2024-08-28 12:18:54
747
原创 代码训练营 Day14 | 226.翻转二叉树 | 101. 对称二叉树 | 104.二叉树的最大深度 | 111.二叉树的最小深度
以我们根节点出发,只有我们先收集完了左右孩子的信息,返回给根节点我们才能进行判断是否是可以翻转的。我们才能知道以左节点为根节点的这颗树和以右节点为根节点的这颗树,是否是相互翻转的。2. 先遍历左右两边子树,中是用来处理条件去找到最大深度。因为我们要收集左右孩子的信息返回给上一个节点,重复这个操作。1. 二叉树里边任意一个节点到根节点的距离。1. 二叉树中任意一个节点到叶子节点的距离。节点左右都不为空,值也相等,这时应该向下继续遍历。2. 从叶子节点开始,叶子节点的高度是1。后序遍历: 左右中(遍历顺序)
2024-08-27 05:42:08
319
原创 代码训练营 Day13 | 递归遍历 | 层序遍历
由于我们在遍历树的时候在某一层会有两层元素混进来,所以这里的size至关重要,一定是要用变量保存的,因为下一层循环由于不同节点的元素情况不同可能导致size还在变动,所以下一层while循环的条件一定使用size存储的。这里的size可以告诉我们每一层有多少个元素,以及我们应该从队列弹出几个元素。我们通过记录队列的size来得知每一层应该弹出以及应该保存的元素有几个。创建一个数组用来存储每一层元素,最后的结果应该是一个二维数组。与此同时定义一个变量size来记录每一层队列的长度。确定递归函数的终止条件。
2024-08-26 08:24:54
564
原创 代码训练营 Day11 | 150. 逆波兰表达式求值 | 239. 滑动窗口最大值 | 347.前 K 个高频元素
1. 由于小顶堆根节点是最小值,每次push新元素进来都会把最小的给pop出去。5. 使用小顶堆来实现: 每次push进来一个新元素,也要pop一个堆顶的元素。2. 每移动一个位置把遗弃的元素给pop掉,把新加入的元素push进来。3. 小顶堆: 根节点是最小的元素;2. 大顶堆: 头部的元素都要比孩子节点的元素大;1. 每滑动一次pop()一个元素,对应的也要push()一个元素。4. 用堆来遍历一遍map里面所有的元素,然后堆里就维持k个元素。2. 每次取元素的时候只取两个元素。5. 输出前k个元素。
2024-08-24 13:10:49
422
原创 代码训练营 Day10 | 232.用栈实现队列 | 225. 用队列实现栈 | 20. 有效的括号 | 1047. 删除字符串中的所有相邻重复项
如果后面元素跟栈存储的括号不一样就说明不符合规则 如果字符串遍历完了,但是栈还有滞留的元素,说明不匹配。在字符串跟栈元素进行比较的时候,如果栈顶部元素跟当前字符串不匹配,不符合要求(第二种情况)注意我们必须要把第一个栈的元素全部存入到第二个栈,不然第二个栈出栈的时候元素会乱。使用另外一个栈作为当第一个栈出栈的时候3->2->1保存到第二个栈。假设元素入栈顺序为1->2->3;2. 栈: 1->2->->3(入栈顺序)这样跟第二栈出栈顺序跟队列就一样了。第一个栈为入栈,第二个栈为出栈。
2024-08-23 06:24:14
334
原创 代码训练营 Day9 | 151.翻转字符串里的单词 | 认识KMP算法
2. 我们找到f的前面与其相等前缀(这里f的前缀是aa)的后面的那个字母也就是b,再重新开始匹配。1. 我们跳到前缀的后面,前缀的后面它的下标就是前缀的长度,也就是最长相等前后缀的长度。3. 0 1 0 1 2 0 统一减1之后变成 -1 0 -1 0 1 -1。2. 我们前缀表最长相等前后缀的值就是我们重新开始匹配元素的下标。1. 前缀: 包含首字母 不包含为字母的所有子串都成为前缀。或者把前缀表整体减1的操作。上面 0 1 0 1 2 0 就是我们的前缀表。1. 前缀表: 0 1 0 1 2 0。
2024-08-22 12:30:56
617
原创 代码训练营 Day8 | 344.反转字符串 | 541.反转字符串II |
判断 i+k <= s.size 才进行反转,保证i+k要在数组范围内。反转跟344题逻辑一样写一个函数调用即可。
2024-08-21 11:20:47
321
原创 代码训练营 Day7 | 454.四数相加II |15. 三数之和 |18. 四数之和 | 383. 赎金信
剪枝操作应该使用break,而不是直接返回result,因为target是未知数我们仅仅是确保了不是负数的情况,如果target是一个比较小的负数,我们需要相加很多负数才能变的更小所以这里使用的是break。nums[k] > target 这个做法是错误的,因为target可以是正数可以是负数, 因为nums[k] 已经比target大了那么你后面的数字怎么相加都不可能等于target,数组是排序过的。剪枝操作的主要目的是为了提高算法的效率,避免不必要的计算。对两层for循环的变量i和k都进行剪枝操作。
2024-08-20 06:37:41
1588
原创 代码训练营Day 6 | 242.有效的字母异位词 | 349. 两个数组的交集 | 202. 快乐数 | 1. 两数之和
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
2024-08-19 02:42:50
536
原创 代码训练营 Day4 | 24. 两两交换链表中的节点 | 19.删除链表的倒数第N个节点 | 142.环形链表II
从起点到入口处设为x2. 从入口位置到相遇位置设为y3. 从相遇位置到入口位置设为z速度n代表快慢指针相遇之前快指针在环里走了几圈的圈数;速度3. 通过 distance / velocity * time来列出下面等式,因为时间相同路程相同所以速度可以列为一样3. n >= 1因为快指针肯定要最少跑了一圈才能追上慢指针这里后面的(n-1)z+z其实就是nz只不过是拆开的8. 当n等于1的时候;快指针转了一圈和慢指针相遇了9. x = z。
2024-08-17 05:13:46
1471
原创 代码训练营 Day3 | 203.移除链表元素 | 707.设计链表 | 206.反转链表
2. 链表中是不存在完全删除一个节点的,而是让删除节点的前一个节点指向删除节点后面的一个节点,如果试用的是C++ 记得手动释放内存。,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)最后返回一定是返回prev指针,因为prev指针是我们新的头节点位置(原始链表的尾部)1. 设置一个虚拟头节点,这样可以避免遍历链表时,头节点被更改。,一个指向下一个节点,一个指向上一个节点。指针链接在内存中各个节点。双链表: 每一个节点有。
2024-08-16 05:54:58
681
原创 代码训练营 Day2| 209.长度最小的子数组 |59.螺旋矩阵II
1. 滑动窗口要清楚窗口的起始位置以及如何判断窗口是否应该滑动2. 螺旋数组循环的区间边界和每一条边界处理规则是关键,记好口诀;从左到右,从上到下,从右到左,从下到上;遇到奇数记得填充。
2024-08-15 04:38:12
513
原创 代码训练营 Day1| 704. 二分查找 | 27. 移除元素 | 977.有序数组的平方
1. 在写暴力破解的时候一开始使用的是双层for loop去来暴力破解,不过我发现好像因为外层for loop即使使用i-=1的方法也无法避免会跳过元素从而让答案错误,所以我认为在python中是否这题的暴力破解只能使用一层while循环一层for循环去得到正确答案?让快指针的值赋值给慢指针,这样当慢指针指向目标值的时候,快指针已经不在目标值的位置,从而可以让慢指针覆盖掉目标值达到更新数组的目的。[1,1]是个合法的区间。3. 快指针每次循环都在移动,而慢指针只有在快指针指向的值不等于目标值时移动。
2024-08-14 06:06:27
525
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅