自定义博客皮肤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)
  • 收藏
  • 关注

原创 代码随想录算法训练营Day 28|Leetcode93 复原IP地址、Leetcode78 子集、Leetcode90 子集 II

与上题相比区别就是集合里有重复元素了,而且求取的子集要去重。回溯算法中的去重问题,与。如果把子集问题、组合问题、分割问题都抽象为一棵树的话,时间复杂度:O(n * 2^n)时间复杂度:O(n * 2^n)时间复杂度:O(1)空间复杂度:O(n)空间复杂度:O(n)空间复杂度:O(n)

2024-02-22 17:08:29 360

原创 代码随想录算法训练营Day 27|LeetCode39 组合总和、Leetcode40 组合总和 II、Leetcode131 分割回文串

本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回。此题需要加一个bool型数组used,用来记录同一树枝上的元素是否使用过。去重的功能就是used来完成的。空间复杂度:O(target)时间复杂度:O(n*2^n)时间复杂度:O(n*2^n)时间复杂度:O(n*2^n)空间复杂度:O(n^2)空间复杂度:O(n)

2024-02-22 15:08:12 340

原创 代码随想录算法训练营Day 25|回溯算法:LeetCode216 组合总和 III、Leetcode17 电话号码的字母组合

无非就是多了一个限制,本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,...,9]。本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。可以使用map或者定义一个二维数组来做映射,这里定义一个二维数组string letterMap[10]空间复杂度:O(3^m*4^n),其中m是对应四个字母的数字个数,n是对应三个字母的数字个数。剪枝操作:已选元素总和如果已经大于n,那么往后遍历就没有意义了,直接剪掉。时间复杂度:O(3^m*4^n)时间复杂度:O(n*2^n)

2024-02-21 16:32:59 586

原创 代码随想录算法训练营Day 24|回溯算法:理论基础、LeetCode77 组合

递归来做层叠嵌套(可以理解是开k层for循环),每一次的递归中嵌套一个for循环,那么递归就可以用于解决多层嵌套循环的问题了。此时递归的层数大家应该知道了,例如:n为100,k为50的情况下,就是递归50层。回溯法并不是什么高效的算法,其本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。回溯法解决的问题都可以抽象为树形结构,因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。

2024-02-21 15:58:12 767 1

原创 代码随想录算法训练营Day 23|LeetCode669 修剪二叉搜索树、Leetcode108 将有序数组转换为二叉搜索树、Leetcode538 把二叉搜索树转换为累加树

①若root->val<low,则递归其右子树;②若root->val>high,则递归其左子树。根据左闭右闭区间的不变量递归切割左右区间。空间复杂度:O(logn)时间复杂度:O(n)空间复杂度:O(n)时间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(n)

2024-02-20 16:48:18 764

原创 代码随想录算法训练营Day 22|LeetCode235 二叉搜索树的最近公共祖先、Leetcode701 二叉搜索树中的插入操作、Leetcode450 删除二叉搜索树中的节点

需要理解一点:从上向下递归遍历,第一次遇到 cur节点是数值在[q, p]区间中,那么cur就是 q和p的最近公共祖先。根据二叉搜索树性质检索,找到NULL位置插入节点即可。(无需重构成平衡树)时间复杂度:O(n)空间复杂度:O(1)时间复杂度:O(n)空间复杂度:O(1)时间复杂度:O(h)空间复杂度:O(n)

2024-02-20 16:27:53 818

原创 代码随想录算法训练营Day 21|LeetCode530 二叉搜索树的最小绝对差、Leetcode501 二叉搜索树中的众数、Leetcode236 二叉树的最近公共祖先

在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。本题仍可使用中序遍历得出一个升序数组求得相邻最小绝对值差,但为了简便起见直接在遍历树时计算出差值,此时只需要一个指向前一个结点的指针pre。求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。后序遍历是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。空间复杂度:O(n)空间复杂度:O(n)

2024-02-19 17:50:43 936 1

原创 代码随想录算法训练营Day 20|LeetCode654 最大二叉树、Leetcode617 合并二叉树、Leetcode700 最大二叉树中的搜索、Leetcode98 验证二叉搜索树

先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组;构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。空间复杂度:O(min(m,n)),其中m,n为两棵树的节点数。对一个节点进行合并之后,还要对该节点的左右子树分别进行合并。根据二叉搜索树的性质(左<中<右)进行分支递归即可。时间复杂度:O(min(m,n))时间复杂度:O(n^2)空间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(n)

2024-02-19 14:49:15 1263 1

原创 代码随想录算法训练营Day 18|LeetCode513找树左下角的值、112 路径总和、113 路径总和II、106 从中序与后序遍历序列构造二叉树、105 从前序与中序遍历序列构造二叉树

同时到了叶子节点的话,说明找到了目标和。该题找到一个符合条件的路径即可,所以需要bool返回值,终止条件:让计数器。第⼆步:如果不为空,那么取后序数组最后⼀个元素作为节点元素。第三步:找到后序数组最后⼀个元素在中序数组的位置,作为切割点。第四步:切割中序数组,切成中序左数组和中序右数组。第五步:切割后序数组,切成后序左数组和后序右数组。第⼀步:如果数组大小为零的话,说明是空节点了。时间复杂度:O(n)空间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(n)

2024-02-16 23:05:14 1618 1

原创 代码随想录算法训练营Day 17|二叉树:LeetCode110 平衡二叉树、Leetcode257 二叉树的所有路径、Leetcode404 左叶子之和

要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。这道题目涉及到回溯,因为要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。后序遍历求得高度,前序遍历求得深度,最大深度即为根节点的高度,所以昨天的题可以用后序遍历求出结果,而本题也是使用后序遍历,求得真正每个节点的高度,以判断是否满足平衡二叉树的定义。时间复杂度:O(n^2)时间复杂度:O(n^2)空间复杂度:O(n^2)空间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(n)

2024-02-16 16:39:46 1424

原创 代码随想录算法训练营Day 16|LeetCode104 二叉树的最大深度、LeetCode559 n叉树最大深度、eetcode111 二叉树的最小深度、Leetcode222 完全二叉树的节点个数

下图中的例子便需要特殊讨论①若左子树为空,右子树不为空,则最小深度为1+右子树最小深度;②若右子树为空,左子树不为空,则最小深度为1+左子树最小深度;③若左右子树都不为空,则最小深度为1+min(左子树最小深度,右子树最小深度)。求二叉树最小深度看似与求最大深度类似,实则处理起来还是更麻烦一些:最小深度概念为。与求深度类似,采用后序遍历,将max换成求和,递归后即可得完全二叉树的节点个数。空间复杂度:O(height) height为二叉树高度。空间复杂度:O(height)时间复杂度:O(n)

2024-02-15 21:43:51 1534 1

原创 代码随想录算法训练营Day 15|二叉树:LeetCode226 翻转二叉树、Leetcode101 对称二叉树

经典题目,递归前序或后序遍历实现(递归中序会重复),也可以使用迭代法或层序遍历(广度优先搜索)实现,详见。注意遍历顺序,对于左子树是左右中,对于右子树是右左中,递归。空间复杂度:O(logn)时间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(n)

2024-02-03 21:53:28 1771 1

原创 代码随想录算法训练营Day 13|栈与队列:LeetCode239 滑动窗口最大值、Leetcode347 前K个高频元素

因为优先级队列对外接口只是从队头取元素,从队尾添加元素,再无其他取元素的方式,看起来就是一个队列。本题要用小顶堆,因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。我们需要一个队列,放进去窗口里的元素,随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。时间复杂度:O(n)空间复杂度:O(k)空间复杂度:O(n)

2024-01-26 22:49:50 1865 1

原创 代码随想录算法训练营Day 11|栈与队列:LeetCode20 有效的括号、Leetcode1047 重复的子字符串、Leetcode150 逆波兰表达式求值

括号匹配是栈的经典应用,408中也比较常见:遍历字符串s,遇到三种左括号入栈,遇到右括号则比对,若栈为空(右括号数量多于左括号)或栈顶不是同一类型的左括号则return false;逆波兰式即后缀表达式,其求值为栈的经典应用,408中也常见,遇到数就入栈,遇到操作符op便从栈顶依次弹出两个数nums1和nums2,执行nums2 op nums1后将结果再入栈,遍历后栈内的唯一元素即为表达式结果。与上题类似,本题使用栈将重复的元素消去,遍历后栈中剩下的元素即为结果的倒序,再逆置一次即可。

2024-01-22 11:50:50 2349

原创 代码随想录算法训练营Day 10|栈与队列:LeetCode232 用栈实现队列、Leetcode225 用队列实现栈

队列实现栈408中也常见,但是可以直接使用双端队列比较容易,如果是单向队列则需要思考模拟过程:一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。本题408种较为常见,用两个栈即可模拟队列,一个用于输入,一个用于输出。还要注意代码复用性,如peek调用了pop操作。时间复杂度:push和empty为O(1), pop和peek为O(n)时间复杂度:pop为O(n),其他为O(1)空间复杂度:O(n)空间复杂度:O(n)

2024-01-22 01:02:04 2356

原创 代码随想录算法训练营Day 9|KMP算法:LeetCode28 找出字符串中第一个匹配项的下标、Leetcode459 重复的子字符串

时间复杂度O(m+n)空间复杂度O(m) m为needle长度。

2024-01-21 21:36:18 2471 1

原创 代码随想录算法训练营Day 8|LeetCode344 反转字符串、Leetcode541 反转字符串II、卡码网54 替换数字、Leetcode151 反转字符串里的单词、卡码网55 右旋转字符串

①利用resize将数组扩展到数字替换成number之后的大小;②使用双指针从后向前替换数字字符(从后向前时间复杂度更低,详见。三次逆置的思想:①先将字符串整体逆置;②再将前k个字符逆置;③最后将后n-k个字符逆置,即得到右旋转的效果。按照题目要求模拟行为进行反转即可,本题用到了reverse库函数,也可以自己写。使用双指针,从字符串两边向中间一直做交换操作即可。此题关于库函数的使用原则可见。②将整个字符串反转;③输出替换后的字符串。

2024-01-18 20:47:59 2501 1

原创 代码随想录算法训练营Day 7|LeetCode454 四数相加II、Leetcode383 赎金信、Leetcode15 三数之和、Leetcode18 四数之和

①定义unordered_map,其中key为nums1和nums2数组中各元素之和,value为该和出现频次;②定义count记录,遍历nums3和nums4,若map中有等于0-c-d的key,则其符合要求,令count+其对应的频次;本题主要在选取使用map,key和value分别对应什么数据,以及降时间复杂度(将a+b和c+d分别循环,时间从n^4降到n^2)与三数之和类似,在其基础上多加一层for循环,重点注意多级剪枝操作,否则会超时。时间复杂度O(n^2)空间复杂度O(n^2)

2024-01-17 21:38:54 2537

原创 代码随想录算法训练营Day 6|LeetCode242 有效的字母异位词、Leetcode349 两个数组的交集、Leetcode202 快乐数、Leetcode1 两数之和

今天开启哈希表相关内容,哈希表理论基础可见。

2024-01-15 21:46:51 2246 1

原创 代码随想录算法训练营Day 5|数组、链表总结

数组下标从0开始数组内存空间地址连续数组的元素不能删除,只能覆盖2.数组经典题型:(1)二分法明确循环不变量规则,即在循环中对边界的处理要保持区间的定义不变,常见的有写法有左闭右闭[left,right]和左闭右开[left,right).以Leetcode704二分查找为例,对于左闭右闭,思路代码可见文章代码随想录算法训练营Day 1左闭右闭。

2024-01-15 00:34:46 2834 1

原创 代码随想录算法训练营Day 4|LeetCode24 两两交换链表中的节点、Leetcode19 删除链表的倒数第N个节点、Leetcode160 相交链表、Leetcode142 环形链表II

今天的题目都是408常考的链表题型,除了环形链表找入环结点的数学技巧外都没卡思路,但是边界问题总是犯错,指针越界指向非法地址,明显感觉到和初试时的伪代码的差别,做题还是需要仔细,少犯小错误。

2024-01-13 22:36:32 2289

原创 代码随想录算法训练营Day 3|LeetCode203 移除链表元素、Leetcode707 设计链表、Leetcode206 反转链表

关于LeetCode203 移除链表元素、Leetcode707 设计链表、Leetcode206 反转链表的一点想法

2024-01-13 01:05:57 2120

原创 代码随想录算法训练营Day 2|LeetCode977 有序数组的平方、Leetcode209 长度最小的子数组、Leetcode59 螺旋矩阵 II、Leetcode54 螺旋矩阵

像滑动窗口、螺旋矩阵这样的题方法性比较强,一开始看到题都断了思路,也是理解了为啥卡哥推荐先看视频和文章之后再做题,以后一定改T T。

2024-01-12 18:12:41 3031

原创 代码随想录算法训练营Day 1|LeetCode704 二分查找、Leetcode35 搜索插入位置、Leetcode34 在排序数组中查找元素的第一个和最后一个位置、LeetCode27 移除元素

在排序数组中查找元素的第一个和最后一个位置今天第一天,因为时间比较赶,题目也比较基础,就没咋看卡哥的视频和资料,直接就做题了,也是在找找状态的同时复习一些基础知识了,关于卡哥讲到的二分法区间闭开问题等等理论知识明天找时间补上。自己写代码的时候还是有些生硬,觉得有些小问题,比如34题的执行时间、27题数组逻辑长度后面的空间未释放等等,明天继续努力。

2024-01-10 23:53:48 2353 1

空空如也

空空如也

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

TA关注的人

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