- 博客(21)
- 收藏
- 关注
原创 算法打卡 Day29(回溯算法)-复原 IP 地址 + 子集 + 子集 Ⅱ
采用 isValid 函数判断当前切割得到的子串是否有效。在子集问题中需要在每一层递归中进行结果的收集。这是一道切割问题,可以参考分割回文串的思路。
2024-09-05 01:50:15
197
原创 算法打卡 Day28(回溯算法)-组合总数 + 组合总数 Ⅱ+ 电话号码的字母组合
【代码】算法打卡 Day28(回溯算法)-组合总数 + 组合总数 Ⅱ+ 电话号码的字母组合。
2024-09-04 00:00:35
316
原创 算法打卡 Day25(二叉树)-修剪二叉搜索树 + 将有序数组转换为二叉搜索树 + 把二叉搜索树转换为累加树
对于每个节点,如果其值小于区间最小值,不能直接将其完全删除,而应判断其右子树的值(该节点值小于区间,但右子树的值大于该节点,可能属于区间范围内);同理,如果节点值大于区间范围,则需要进一步判断该节点的左子树是否属于区间范围。根据二叉搜索树的性质可知,右侧节点大于根节点大于左侧节点,因此采用右中左的遍历顺序,通过 pre 和 cur 双指针对每个节点的值进行累加。
2024-09-03 02:16:25
483
原创 算法打卡 Day24(二叉树)-二叉搜索树的最近公共祖先 + 二叉搜索树中的插入操作 + 删除二叉搜索树中的节点
注意在循环之外需要 return nullptr 处理当 root 为空的情况。利用二叉搜索树的特性,p 和 q 的最近公共祖先的值应该介于两者值之间。
2024-08-17 15:09:56
411
原创 算法打卡 Day23(二叉树)-二叉搜索树的最小绝对差 + 二叉搜索树中的众数 + 二叉树的最近公共祖先
采用后序遍历,左右的处理逻辑是当遇到 p 或者 q 时向上返回,中节点则判断其左右子节点的返回值是否为空,如果均不为空,则为最近公共祖先。采用双指针的方法指向当前节点和前一个节点,从而计算相邻元素的差值,并与当前的最小值进行比较。返回的是众数的集合,因为可能有多个数出现的频率相同。
2024-08-16 23:58:46
373
原创 算法打卡 Day22(二叉树)-最大二叉树 + 合并二叉树 + 二叉搜索树中的搜索 + 验证二叉搜索树
要注意二叉搜索树不仅仅是中节点的值大于左节点小于右节点,同时需要保证中节点的值大于左子树的所有值,小于右子树的所有值。要充分利用二叉搜索树的特性,要使用中序遍历(左中右),在这样的遍历顺序下,遍历的值是逐渐递增的。:二叉搜索树自带顺序,根节点的左子树的节点要比根节点的值都小,右子树的节点的值比根节点的都大。
2024-08-16 15:53:41
487
原创 算法打卡 Day20(二叉树)-找树左下角的值 + 路径总和 + 从中序与后序遍历序列构造二叉树
前面两道题分别考察了中序和前序、中序和后序确定构建二叉树,但后序和前序不能确定唯一的一棵二叉树,因为不能确定左右区间的分割点。后序最后一个节点是根节点,然后通过中序完成根节点左右节点的切割。之后的节点划分类似。采用递归的方法,在处理过程中没有对“中”的处理,因此本题中前中后序算法是类似的。我们要找的是深度最大的叶子节点。这道题用层序遍历相对更简单,
2024-08-12 11:40:11
934
原创 算法打卡 Day19(二叉树)-平衡二叉树 + 二叉树的所有路径 + 左叶子之和 + 完全二叉树的节点个数
*完全二叉树的定义是:**在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。为了降低时间复杂度,我们可以利用完全二叉树的特性,即对于满二叉树,其节点个数为(2^n-1),在遍历过程中仅仅遍历两侧的节点,从而可以降低时间复杂度。这道题我们使用递归,采用后序遍历的方法,不断获得左右节点的高度,并在中间节点比较其高度是否符合平衡二叉树的要求。叶子节点的左右子节点都为 nullptr,左叶子节点指的是该叶子节点是父节点的左节点。
2024-08-11 15:43:04
400
原创 算法打卡 Day18(二叉树)-层序遍历 + 翻转二叉树 + 对称二叉树
判断二叉树是否对称我们可以转化为判断中间节点的左右节点翻转后是否相等,在比较左右节点翻转时,我们需要分别比较外侧节点和内侧节点是否对称。在层序遍历的基础上翻转 result 数组即可。我们使用队列模拟二叉树的层序遍历。
2024-05-24 15:24:31
497
2
原创 算法打卡 Day14(二叉树)-理论基础 + 递归遍历 + 迭代遍历 + 统一迭代
主要介绍二叉树的理论基础知识,并运用递归法和迭代法实现二叉树的前序、中序和后序遍历。
2024-05-24 10:17:56
1007
1
原创 算法打卡 Day13(栈与队列)-滑动窗口最大值 + 前 K 个高频元素 + 总结
栈和队列是容器适配器,底层容器使用不同的容器,那么栈内数据在内存中的分布就不一定连续。在缺省状况下,栈和队列的默认底层容器时 deque,其内存分布不连续。递归的实现是栈:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。
2024-05-22 17:56:46
1005
2
原创 代码随想录算法打卡 Day8(字符串)-反转字符串 + 替换数字 + 反转字符串里的单词 + 右旋转字符串
首先分析将数字替换为字母对数组的影响,'number’占用数组的 6 个空间,而数字仅占据 1 个空间,因此当数组中存在 x 个空间时,相应地数组的大小需要扩大(6-1)*x 倍。这道题的解题思路是先去除字符串中多余的空格,然后对字符串整体进行翻转,最后根据空格的位置将每个单词进行反转,最后就可以实现翻转字符串里的单词这一目标。,再嵌套在 for 循环中这段代码整体的时间复杂度将变为。在之后根据空格的位置,在每个单词内部进行翻转。我们可以尝试使用双指针的方法降低时间复杂度。
2024-05-13 14:38:06
846
原创 代码随想录算法打卡 Day7(哈希表)-四数相加 Ⅱ+ 赎金信 + 三数之和 + 四数之和
对数组 ABCD 两两进行求和,对于 AB 两数组,求和后将值保存在哈希结构中,然后对 CD 数组求和后,到哈希结构中寻找是否有出现符合与其相加为 0 的值,如果存在,则将 AB 中相加等于该值的个数加入到总体的计数中。使用 unordered_map 的原因是在本题中不仅需要将相加的值记录下来,还需要记录该值出现的次数,因此 map 中的 key 是 AB 两数相加的值,value 是该值出现的次数。四数之和的思路整体上与三数之和类似,需要在三数之和的基础上再嵌套一层循环,一些细节的地方需要注意。
2024-05-03 18:00:22
985
原创 代码随想录算法打卡 Day6-哈希表理论基础 + 有效的字母异位词 + 两个数组的交集 + 快乐数 + 两数之和
哈希表(Hash table)是根据关键码的值二直接进行访问的数据结构,其。数组是一张哈希表。
2024-05-03 13:21:22
855
1
原创 代码随想录算法打卡 Day4-两两交换链表中的节点 + 删除链表的倒数第 N 个节点 + 链表相交 + 环形链表 II
对于第一个问题,可以通过双指针的思路进行判断,设置快慢两个指针,快指针每次移动两个步长,慢指针移动一个步长,如果链表中没有环,则快慢指针一定不会相遇,如果有环,则快慢指针一定会相遇(一定相遇的原因:快指针相对于慢指针每次走一个步长,不会出现跳过的情况)这里使用双指针的解题方法,快指针比慢指针先走 n+1 步(n+1 而非 n 的原因是删除倒数第 n 个元素需要找到第 n+1 的元素,才能让倒数第 n+1 个元素的 next 指向它的 next 的 next 从而删除目标元素)
2024-05-02 21:45:09
1027
2
原创 代码随想录算法打卡Day3-链表理论基础+移除链表元素+设计链表+反转链表
/单链表的定义int val;//节点上存储的元素//指向下一个节点的指针ListNode(int x): val(x), next(nullptr){} //节点构造函数。
2024-05-01 19:23:54
894
1
原创 代码随想录算法打卡 Day2-有序数组的平方 + 长度最小的子数组 + 螺旋矩阵 II
在暴力解法的基础上,我们可以通过滑动窗口(也可以理解为双指针)的方式优化代码,将暴力解法中的两层循环变为一层,首先我们要考虑指针的设置是从作为数组的起始点还是结束点,不难想出,如果指针作为起始点的话,后续还需要遍历整个数组寻找符合条件的子数组,这与暴力解法的思路无异,因此我们可以考虑将指针设置为数组的右侧点解决这道问题。在本题的代码实现上,对于每条边选择左闭右开的区间,这样可以保证每次循环中四条边的边界条件相同。此时,通过双指针的引入,我们成功将这道题的复杂度优化为。,我们可以通过双指针来优化这个算法。
2024-04-18 22:57:08
1469
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人