算法训练营
文章平均质量分 79
仓海子
这个作者很懒,什么都没留下…
展开
-
算法训练营Day19 | 77.组合,216.组合总和III,17. 电话号码的字母组合
思路和上面两题略有差别,这个每层都在不同的集合中选择数字,前两题每层都在相同集合中选择,所以要注意不能重复。77.组合,216.组合总和III,17. 电话号码的字母组合。注意回溯,可以剪枝,有点像深搜的写法。原创 2024-10-30 21:35:55 · 272 阅读 · 0 评论 -
算法训练营Day18 | 669.修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树
二叉搜索树,中序遍历有序(左中右),累计树其实就是有序数组倒置之后的累加和(后一项加上前面的累加和),有序倒置就是(右中左)按这个顺序遍历二叉树同时再进行累加。669.修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树。左闭右闭区间,通过将中间节点作为根节点来实现平衡二叉树,通过数组下标划分左右子树。原创 2024-10-29 21:23:03 · 398 阅读 · 0 评论 -
算法训练营Day17 | 235.二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点
235.二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点。找到第一个满足值在[p, q]区间内的节点就是公共节点。用递归,递归返回删除节点后的子树的根节点。根据二叉搜索树找到空节点插入。原创 2024-10-29 20:00:28 · 255 阅读 · 0 评论 -
算法训练营Day16 | 530.二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先
递归左右子树,如果子树中存在p、q节点则返回p、q节点,这样如果左右子树均不为空,则该节点为最近公共祖先节点;如果p节点是q节点的祖先,那么最后也会返回p,即最近公共祖先。530.二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先。中序遍历二叉树,有序遍历二叉树所以可以累计相同数字的个数。中序遍历,记录前一节点信息,比较差值。原创 2024-10-28 20:33:38 · 396 阅读 · 0 评论 -
算法训练营Day15 | 654.最大二叉树, 617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树
654.最大二叉树, 617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树。构建二叉树,使用下标划分左子树和右子树,每次选择范围内最大值构造根节点,递归构造左右子树。二叉搜索树:左子树均小于根节点,右子树均大于根节点。二叉树搜索树的中序遍历应该是有序的。原创 2024-10-23 21:56:00 · 419 阅读 · 0 评论 -
算法训练营Day14 | 513.找树左下角的值,112. 路径总和,106. 从中序与后序遍历序列构造二叉树
根据后续遍历的最后一个节点是根节点,用根节点来划分中序遍历的左右子树,再将后序遍历的左右子树进行划分,再不断递归左右子树。513.找树左下角的值,112. 路径总和,106. 从中序与后序遍历序列构造二叉树。同上一题,递归可以不用传入数组,用下标代替(左右子树都是连续的)原创 2024-10-22 22:11:30 · 853 阅读 · 0 评论 -
算法训练营Day13 | 110.平衡二叉树,257. 二叉树的所有路径,404. 左叶子之和,222. 完全二叉树的节点个数
110.平衡二叉树,257. 二叉树的所有路径,404. 左叶子之和,222. 完全二叉树的节点个数。左叶子的定义:要从叶子的父节点判断,父节点的左节点不为空,且左节点没有左右节点。原创 2024-10-21 23:00:59 · 839 阅读 · 0 评论 -
算法训练营Day12 | 226.翻转二叉树,101. 对称二叉树, 104. 二叉树的最大深度, 111. 二叉树的最小深度
算法训练营Day12算法训练营Day12题目226. 翻转二叉树思路代码101. 对称二叉树思路代码104. 二叉树的最大深度思路代码111. 二叉树的最小深度思路代码补充内容算法训练营Day12226.翻转二叉树,101. 对称二叉树, 104. 二叉树的最大深度, 111. 二叉树的最小深度题目226. 翻转二叉树题目链接:https://leetcode.cn/problems/invert-binary-tree/description/文章讲解:思路遍历每个节点,将每个节点的左右孩原创 2024-10-20 19:58:48 · 414 阅读 · 0 评论 -
算法训练营Day11 | 递归遍历,迭代遍历,统一迭代,层序遍历
理论基础,递归遍历,迭代遍历,统一迭代,层序遍历文章讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html文章讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E9%81%8D%E5%8E%86.html文章讲解:https://p原创 2024-10-17 20:59:10 · 742 阅读 · 0 评论 -
算法训练营Day10 | 150.逆波兰表达式求值,239. 滑动窗口最大值,347. 前 K 个高频元素
后缀表达式,用栈实现计算:数字压入栈,碰到符号则弹出栈顶的两个数字,注意运算顺序,计算完压入栈中,最后栈中的元素即为最后的答案。用双端队列实现单调队列,只要后元素比前元素大,前一个元素则无意义(后元素比前元素在窗口内的时间长)出现频率前k高的元素,就是保留k个最大值,使用小顶堆每次将最小元素出队,保留k个值即为最大值。参考题解中的方法,分为未形成窗口和形成窗口两部分,感觉主要是考察双端队列deque的使用。优先级队列每次出队的元素是队列中优先级最高的那个元素,而不是队首的元素。原创 2024-10-15 22:23:39 · 261 阅读 · 0 评论 -
算法训练营Day9 | 232.用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串中的所有相邻重复项
用两个栈实现队列,分为inStack和outStack,最先进来的会在inStack的低端,如果要弹出的话需要将inStack中的所有元素压入outStack中,这样最底端的元素就在栈顶,如果有新元素进来都需要先压入inStack,始终保持outStack栈顶为队列最前端元素,直到outStack为空才将inStack中元素弹出到outStack中。理论基础,232.用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串中的所有相邻重复项。c++中的string也能实现栈。原创 2024-10-15 21:46:31 · 760 阅读 · 0 评论 -
算法训练营Day8 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.重复的子字符串
151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.重复的子字符串,字符串总结,双指针回顾。双指针,两种方式,一种原地修改(适合可以修改字符串的语言),一种需要额外的空间O(n),搞清楚字符串的下标是难点。看了题解,得到的结论,原地实现字符串右移动,先反转整体(让右部分到字符串左边),再反转两部分,左移同理。原创 2024-10-14 22:11:43 · 313 阅读 · 0 评论 -
算法训练营Day7 | 344. 反转字符串,541. 反转字符串II,卡码网:54.替换数字
344.反转字符串,541. 反转字符串II,卡码网:54.替换数字。模拟题,统计正常反转的次数,对最后一部分反转特殊处理即可。双指针:两个指针一个指向头一个指向尾,不断交换即可。看了题解尝试了双指针扩容的方法。看到这题目想到了直接输出。原创 2024-10-09 22:19:12 · 318 阅读 · 0 评论 -
算法训练营Day6 | 454.四数相加II,383. 赎金信 ,15. 三数之和,18. 四数之和
和两数相加差不多的思路,只不过两数相加用哈希表存下标,这道题用哈希表存数量;先分成两组,第一组两两相加,用哈希存储可能的和以及出现的次数;要在magazing中找ransomNote,所以要将magazine中的字符数量存在哈希表中,然后遍历ransomNote,让其对应的字符数量减少1,如果字符数小于0则返回false(字符数不够或者不存在该字符)排序+双指针:对于三个不同的数,a、b、c只要满足每次a<b<c即可保证数组不重复,剩下的只要满足每个数不和前一个数相同即可,这样每个位置的数只会取到一次。原创 2024-10-09 20:50:45 · 391 阅读 · 0 评论 -
算法训练营Day5|242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
两个集合:先用集合set1去除数组1的重复元素,再用集合set2存储同时在set1中和数组2中的元素,再遍历一遍set2存储在数组中。哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和。三种情况:结果为i,进入循环,值接近无限大(被证明不可能)题意保证两个字符串长度必须相同,所以只需要考虑这种情况。unordered_map底层用哈希表实现。unordered_set底层用哈希表实现。题意保证一定会找到结果。原创 2024-10-08 20:33:37 · 904 阅读 · 0 评论 -
算法训练营Day4|24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II
24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II。数值相同,不代表指针相同。原创 2024-10-07 22:30:38 · 863 阅读 · 0 评论 -
算法训练营Day3|203.移除链表元素,707.设计链表,206.反转链表
迭代:使用虚拟头节点,这样可以不用额外考虑删除头节点的情况(把头节点视作普通节点),假设有三个节点,那么删除第二个节点时需要让第一个节点的next指向第三个节点,所以指针应该指向第一个节点才能完成这个操作,所以每次判断p->next是否需要删除,如果p->next 为NULL则表示已经遍历完成(最后一个节点在p还没有指向该节点之前已经完成了判断)递归函数返回的是不包含val值的链表的头节点,递归的终止条件是 head 为空,先判断除了头节点之外的值是否为val,最后判断头节点。原创 2024-10-07 15:05:31 · 478 阅读 · 0 评论 -
算法训练营Day2|209.长度最小的子数组,59.螺旋矩阵II,区间和,开发商购买土地
自己的想法:自己列了前几组发现一个规律,就是螺旋是按照 → ↓ ← ↑ 的顺序为一个循环,总共要改变2n-1次方向,并且一个循环结束后相同方向上都会减少一个位置,也就是 i / 4个位置;经过将结果输出然后debug,成功ac了。题解思路:使用l,r,b,t记录边界位置,按照 → ↓ ← ↑ 的顺序为一个循环,每次改变方向时相应的边界就会减小一个,每次只需要从左边界遍历到右边界赋值(从上到下,从右到左,从下到上)即可。首先存储每行和每列的累加和,然后遍历每行和每列,存储当前行之前行的累加和(包括当前行);原创 2024-09-30 20:27:32 · 325 阅读 · 0 评论 -
算法训练营Day1|704. 二分查找,27. 移除元素,977.有序数组的平方
文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html。自己的想法:既然是平方排序,那就是比较绝对值,所以首先找到数组中正负分开的那个下标,然后两个指针一个向左一个向右同时比较指针所指元素的绝对值大小,将绝对值小的数平方后放入新的数组中。题解思路:用两个指针从两端开始比较,将大的值存入新数组的末尾,从后往前存储;报名迟了两天,今天补上第一天的内容。原创 2024-09-27 16:37:39 · 716 阅读 · 0 评论