自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 代码随想录算法训练营第二十九天 | 题目 491.递增子序列 题目 46.全排列 题目 47.全排列 II

本题思路:(1)去重:利用unordered_set进行去重,记录本层的元素,如果没有重复,返回容器的end()迭代器。是记录本层元素是否重复使用,新的一层uset都会重新定义(清空),所以uset只负责本层!(2)保证子序列中递增。

2023-08-25 11:51:10 39

原创 代码随想录算法训练营第二十八天 | 题目 93.复原IP地址 题目 78.子集 题目 90.子集II

要将空集也放入结果集中,因此在backtracking函数中,第一行就要将path放入result;本题的终止条件:逗点的个数是否为3.此外,在终止条件中,要判断最后一段是否合法。startIndex是分割线,判断区间[startIndex, i]是否合法。在原始字符串上加逗点(.),因此下一次递归的开始时i+2。回溯是关于逗点的回溯,当前子串不合法,撤销逗点和逗点计数。相同,都是在for循环中去重,递归遍历时不考虑去重。

2023-08-23 11:38:05 34

原创 代码随想录算法训练营第二十七天 | 题目 39. 组合总和 题目 40.组合总和II 题目 131.分割回文串

这里使用startIndex去重,在纵向遍历过程,递归时传入startIndex,利用startIndex更新candidates[i]的值。在for循环遍历中,利用i++更新candidates[i]的值,此时更新完后,如果candidates[i] == candidates[i-1],说明相邻元素是相同的,而在candidates[i-1]递归的时候,已经找到符合题目要求的元素组合了,因此candidates[i]不用再次进行递归,因此就利用continue跳过本次循环,从而避免产生重复的答案。

2023-08-22 15:45:51 33

原创 代码随想录算法训练营第二十五天 | 题目 216.组合总和III 题目 17.电话号码的字母组合

2.要用for循环遍历每个数字对应的字符串,同时用index记录遍历的第几个的数字。利用回溯进行字母组合。回溯就是增加树的深度。4.将string转化为int型:字符的ASCII值可以通过减去字符’0’来转换为对应的整数值。3.在组合中,for循环横向遍历(遍历自己),递归纵向遍历(遍历别人)。1.先利用string类型数组或map容器建立数字和字母的映射关系。

2023-08-21 20:28:45 25

原创 代码随想录算法训练营第二十四天 | 题目 77. 组合

回溯模板:(1)递归函数的参数和返回值;(2)确定终止条件;(3)单层递归逻辑;回溯法可抽象为一个n叉树。

2023-08-21 16:58:39 29 1

原创 代码随想录算法训练营第二十三天 | 题目 669. 修剪二叉搜索树 题目 108.将有序数组转换为二叉搜索树 题目 538.把二叉搜索树转换为累加树

思路:如果当前节点的值小于val,那么当前节点的左子树也一定小于val,右子树可能有符合范围的节点;同理,如果当前节点的值大于val,那么当前节点的右子树一定也都大于val,左子树可能存在符合范围的节点。树的删除节点,就是将要删除节点的父结点左子树或者右子树重新指向另一个节点。思路:遵循右中左的遍历顺序。迭代法:中序遍历的模板。

2023-08-18 18:58:49 29 1

原创 代码随想录算法训练营第二十二天 | 题目 235. 二叉搜索树的最近公共祖先 题目 701.二叉搜索树中的插入操作 题目 450.删除二叉搜索树中的节点

root->left 和 root->right 是连接要插入的节点node与二叉树的,node的返回由root->left 或root ->right接收。如果p的值大于当前节点的值,q的值小于当前结点的值,那么当前节点就是最近公共祖先。因为当前节点的左子树没有q,当前节点的右子树没有p;后面再遍历过程中,要用左孩子或者右孩子接住返回值,这是将返回值进行安放。分五种情况进行判断,在进行终止条件的判定中,就将五种判断逻辑分别写上。因此,只需要判断p,q的值同时大于或者同时小于当前节点,进行遍历。

2023-08-18 10:00:23 30 1

原创 代码随想录算法训练营第二十一天 | 题目 530.二叉搜索树的最小绝对差 题目501.二叉搜索树中的众数 题目 236. 二叉树的最近公共祖先

解法二:利用递归,中序遍历,双指针法,比较每两个节点的差值,找到最小差值。从底向上遍历,找到q,p的最近公共祖先。解法一:将二叉搜索树转化为有序数组,求数组中的最大差值。(3)在二叉树 的左右子树都无法找到,返回NULL;(1)p,q分别在一个二叉树的左右子树中;(2)p,q在一个二叉树的其中一个子树上;(4)当前p或q节点同时是最近公共祖先。

2023-08-17 15:26:41 46 1

原创 代码随想录算法训练营第二十天 | 题目654.最大二叉树 题目 617.合并二叉树 题目 700.二叉搜索树中的搜索 题目98.验证二叉搜索树

注意:是要比较中间节点大于左子树上的所有节点,小于右子树上的所有节点。而不是仅仅比较当前节点大于左节点,小于右节点。使用双指针:pre指向前一个节点,因为先一直遍历到最底层的左边节点,再一层一层返回,逻辑类似从下往上进行比较。解法一:将二叉树转化成数组,判断该数组是否为一个有序数组。利用分割数组的思想,用索引下标在原数组上进行分割;疑惑点:同时操纵两个二叉树,因此是同步遍历。解法二:在递归遍历中直接判断数组是否有序。递归:主要找到与给定值相同的节点。

2023-08-16 22:31:15 23 1

原创 代码随想录算法训练营第十八天 | 题目513.找树左下角的值 题目 112. 路径总和 题目113.路径总和ii 题目106.从中序与后序遍历序列构造二叉树 题目105.从前序与中序遍历序列构造二叉树

迭代法:在迭代法中,要记录从根节点到当前节点路径的值的总和。

2023-08-16 15:12:15 21 1

原创 代码随想录算法训练营第十七天 | 题目 110.平衡二叉树 题目 257. 二叉树的所有路径 题目 404.左叶子之和

2.vector<int>& path,这里使用引用的方式而不是vector<int> path,因为在迭代回溯过程中,要对原始path一直进行修改。而vector<int> path,在进行右子树遍历时,会创建新的path对象,对这个对象的修改不会影响传递进来的原始。这个语句要写在前面,因为要将叶子结点存到路径中,然后判断当前节点的左右孩子是否存在;对象,因此会发生错误。

2023-08-04 10:13:22 18 1

原创 代码随想录算法训练营第十六天 | 题目 104.二叉树的最大深度 题目 111.二叉树的最小深度 题目 222.完全二叉树的节点个数

每次遍历后,分别计算左右孩子的高度,并在其中取最大值,再+1就是父结点的高度,返回给上一层,父结点此时也是作为左或右孩子,再重复。遍历方式:从叶子结点开始,先遍历左孩子,再遍历右孩子,最后是中,因此是左右中,后序遍历。任意节点到叶子节点的距离(根节点的高度最大,也是二叉树的最大深度);递归法:分别求左右孩子节点的个数,再加上其本身(+1)。最小深度:是根节点到最近的叶子结点最小路径上的节点数。递归法:从叶子结点开始,计算二叉树的高度。任意节点到根节点的举例;最小深度不是1,因为它是。

2023-08-02 22:59:46 30

原创 代码随想录算法训练营第十五天 | 题目 层序遍历 题目 226.翻转二叉树 (优先掌握递归) 题目 101. 对称二叉树 (优先掌握递归)

【代码】代码随想录算法训练营第十五天 | 题目 层序遍历 题目 226.翻转二叉树 (优先掌握递归) 题目 101. 对称二叉树 (优先掌握递归)

2023-08-02 20:28:58 18

原创 代码随想录算法训练营第十四天 | 题目 144.二叉树的前序遍历 题目 94.二叉树的中序遍历 题目 145.二叉树的后序遍历

写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。然后进行处理元素环节:栈内存放了左、中节点的元素,将其分别弹出后,如果存在有孩子,指针指向其右孩子并将右孩子放入栈内。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。指针的更新:TreeNode* node = st.top();

2023-08-01 10:10:56 28

原创 代码随想录算法训练营第十三天 | 题目 239. 滑动窗口最大值 题目 347.前 K 个高频元素

(3)用一个固定节点的priority_queue队列(小顶堆)去遍历unordered_map容器中的元素,最后没有被pop掉,即仍然在队列中的元素就频次前k高的数组元素。为什么要用小顶堆:因为最后要留下频次高的数组元素,小顶堆根节点是所有节点中最小的值,当加入一个新值的时候,直接pop掉小顶堆根节点(比较方便)。:借助队列,队列存放滑动窗口内有可能成为最大值的元素,在滑动窗口移向下一位时,pop掉当前滑动窗口的一个元素,并在尾部push一个新元素。的效率查找一个队列中的最大值或者最小值(堆结构)。

2023-07-26 11:41:25 25 1

原创 代码随想录算法训练营第十一天 | 题目 20. 有效的括号 题目 1047. 删除字符串中的所有相邻重复项 题目 150. 逆波兰表达式求值

思路:遇到数字,将其放入栈中,遇到运算符,将该运算符的前两位数字取出来,要注意数字要保持原来的顺序,先进后出。(后出的放前面,先出的放后面)。(1)符号类型不匹配:当遇到右括号时,判断该括号类型是否与栈顶相同,若相同,就将栈顶元素弹出;否则,返回false;(2)左括号过多:此时栈内会出现无法消除的右括号。当字符串遍历完,栈不为空,返回false;(3)右括号过多:当栈为空,但字符串仍没有遍历完,返回false。思路:使用栈结构,当遇到左括号时,就往栈内存储相同类型的右括号;

2023-07-25 20:20:06 22

原创 代码随想录算法训练营第十天 | 题目 232.用栈实现队列 题目 225. 用队列实现栈

注意:在进行top/peek操作时,只读取元素而不进行移除操作,因此多了一步放回操作,即push操作。pop函数用两个队列实现栈;top用一个队列实现。

2023-07-24 15:50:54 47

原创 代码随想录算法训练营第八天 | 题目 344.反转字符串 题目 541. 反转字符串II 题目 剑指Offer 05.替换空格 题目 151.翻转字符串里 题目 剑指Offer58-II.左旋转字符串

【代码】代码随想录算法训练营第八天 | 题目 344.反转字符串 题目 541. 反转字符串II 题目 剑指Offer 05.替换空格 题目 151.翻转字符串里 题目 剑指Offer58-II.左旋转字符串。

2023-07-20 21:00:01 21

原创 代码随想录算法训练营第六天 | 题目 LeetCode 第454题.四数相加II 题目LeetCode349. 两个数组的交集 题目 LeetCode LeetCode18. 四数之和

(4)对第2、3个数去重:当出现nums[I] + nums[left] + nums[right] = 0时,进行left++、right--,找还有没有和当前第1个数nums[i]的和为0的数,如果在left < right 的情况下,nums[left+1] = nums[left],那么nums[right]是固定的,不可能会出现新的和为0的组合,因此要left++;对于第1个数,要保证选取的是重复数中出现的第一个数,例如{-2,,-1,-1,-1,0,1,2,3,3,3}选取下标为1的-1。

2023-07-08 17:11:19 33

原创 代码随想录算法训练营第五天 | 题目 LeetCode 242.有效的字母异位词 题目LeetCode349. 两个数组的交集 题目 LeetCode 202. 快乐数 LeetCode1. 两数之和

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。取一个正整数n每个的数:(1)取余:n % 10 取得个位上的数(2)取商:n /=10 去掉最末尾的数(即去掉个位上的值)一直重复,可以获得每个位置上的数。

2023-07-06 20:47:50 56 1

原创 代码随想录算法训练营第四天 | 题目 LeetCode24. 两两交换链表中的节点 题目 LeetCode19.删除链表的倒数第N个节点 题目 LeetCode 142.环形链表II

(1)分别设置两个指针fast和slow,fast指针每次走两步,slow指针每次走一步,当存在环的时候,当两个指针都进入环内,fast指针和slow指针会相遇。分析:这题的重点是正序找到要删除的节点的前一个节点。由于slow指针和fast指针是同时出发,而fast指针的速度是slow指针的两倍,那么当他们相遇时,slow指针走的节点总数:x+y(fast指针在slow指针入环的第一圈就能和slow指针相遇);fast指针走的节点总数:x+y+n(y+z),其中n表示fast指针在环内走的圈数;

2023-07-04 23:04:42 33

原创 代码随想录算法训练营第三天 | 题目 LeetCode203.移除链表元素 题目 LeetCode707.设计链表 题目 LeetCode 206.反转链表

在链表指定节点前添加节点,与get(index)相同,要判断index是否合法,index小于0时,在头节点前添加节点,即index=0。添加新节点newNode:先确定newNode->next = cur->next,再确定cur->next = newNode。其次,令cur->next指向删除节点 的后一个节点,即cur->next = cur->next->next.其次,在尾部添加一个新节点,令cur-next指向新节点,即cur->next = newNode。,防止temp变成野指针。

2023-07-04 17:01:04 9

原创 代码随想录算法训练营第二天 | 题目LeetCode977 有序数组的平方 题目LeetCode 209 长度最小的子数组

【代码】代码随想录算法训练营第二天 | 题目LeetCode977 有序数组的平方 题目LeetCode 209 长度最小的子数组。

2023-06-29 22:13:27 23 1

原创 代码随想录算法训练营第一天 | LeetCode704 二分查找、题目LeetCode27 移除元素

当数组nums的nums[fast]=val时,将nums[fast]赋值给nums[slow],即nums[slow]=nums[fast],此后,slow++;重复以上操作,直到循环停止。因为当i的后一个值覆盖数组中下标为i的值时,此时还为判断这个值是否是要移除的值,因此下一轮j循环的时候是从这个地方开始的,初始值j=i+1,因此此时i--;:设置快指针fast和慢指针slow。定义新数组为移除指定元素后的数组。slow表示新数组的下标。

2023-06-28 23:11:25 67 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除