- 博客(25)
- 收藏
- 关注
原创 代码随想录算法训练DAY29|回溯5
本题题解清一色都说是深度优先搜索,但我更倾向于说它用回溯法,而且本题我也是完全使用回溯法的逻辑来分析的。相信大家在本题中处处都能看到是回溯算法:求子集问题(二) (opens new window)的身影,但处处又都是陷阱。对于养成思维定式或者套模板套嗨了的同学,这道题起到了很好的警醒作用。更重要的是拓展了大家的思路大家此时可以感受出排列问题的不同:每层都是从0开始搜索而不是startIndex需要used数组记录path里都放了哪些元素了排列问题是回溯算法解决的经典题目,大家可以好好体会体会。
2024-01-27 23:59:00 972
原创 代码随想录算法训练DAY28|回溯4
相信大家经过了77.组合(opens new window)回溯算法:组合问题再剪剪枝(opens new window)216.组合总和III(opens new window)17.电话号码的字母组合(opens new window)39.组合总和(opens new window)40.组合总和II(opens new window)131.分割回文串(opens new window)93.复原IP地址(opens new window)
2024-01-24 00:22:40 864
原创 代码随想录算法训练DAY27|回溯3
本题和我们之前讲过的77.组合216.组合总和III有两点不同:组合没有数量要求元素可无限重复选取针对这两个问题,我都做了详细的分析。并且给出了对于组合问题,什么时候用startIndex,什么时候不用,并用17.电话号码的字母组合做了对比。最后还给出了本题的剪枝优化,这个优化如果是初学者的话并不容易想到。在求和问题中,排序之后加剪枝是常见的套路!可以看出我写的文章都会大量引用之前的文章,就是要不断作对比,分析其差异,然后给出代码解决的方法,这样才能彻底理解题目的本质与难点。
2024-01-22 23:22:07 1730
原创 代码随想录算法训练DAY25|回溯2
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]
2024-01-21 23:12:36 999
原创 代码随想录算法训练营DAY24|回溯1
组合问题是回溯法解决的经典问题,我们开始的时候给大家列举一个很形象的例子,就是n为100,k为50的话,直接想法就需要50层for循环。从而引出了回溯法就是解决这种k层for循环嵌套的问题。然后进一步把回溯法的搜索过程抽象为树形结构,可以直观的看出搜索的过程。接着用回溯法三部曲,逐步分析了函数参数、终止条件和单层搜索的过程。本篇我们准对求组合问题的回溯法代码做了剪枝优化,这个优化如果不画图的话,其实不好理解,也不好讲清楚。
2024-01-21 20:47:24 874
原创 代码随想录算法训练DAY23|二叉树9
力扣题目链接给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。确定递归函数的参数以及返回值这里我们为什么需要返回值呢?因为是要遍历整棵树,做修改,其实不需要返回值也可以,我们也可以完成修剪(其实就是从二叉树中移除节点)的操作。但是有返回值,更方便,可以通过递归函数的返回值来移除节点。代码如下:TreeNode* trimBST(TreeNode* root,
2024-01-07 20:22:44 1949 1
原创 代码随想录算法训练DAY22|二叉树8
对于二叉搜索树的最近祖先问题,其实要比普通二叉树公共简单的多。不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。最后给出了对应的迭代法,二叉搜索树的迭代法甚至比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。
2024-01-06 21:25:07 911 1
原创 代码随想录算法训练DAY21|二叉树7
这道题目刷过的同学未必真正了解这里面回溯的过程,以及结果是如何一层一层传上去的。那么我给大家归纳如下三点求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。
2024-01-04 10:41:51 877 1
原创 代码随想录算法训练DAY20|二叉树6
注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。
2024-01-03 09:42:11 945 1
原创 代码随想录算法训练DAY18|二叉树5
本题涉及如下几点:递归求深度的写法,我们在110.平衡二叉树中详细的分析了深度应该怎么求,高度应该怎么求。递归中其实隐藏了回溯,在257. 二叉树的所有路径中讲解了究竟哪里使用了回溯,哪里隐藏了回溯。层次遍历,在二叉树:层序遍历登场!深度讲解了二叉树层次遍历。所以本题涉及到的点,我们之前都讲解过,这些知识点需要同学们灵活运用,这样就举一反三了。###本篇通过leetcode上112. 路径总和 和 113. 路径总和ii 详细的讲解了 递归函数什么时候需要返回值,什么不需要返回值。
2024-01-02 16:51:51 832
原创 代码随想录DAY17|二叉树4
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7]返回 true。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4]返回 false。
2023-12-26 23:19:54 970 1
原创 代码随想录算法训练营DAY16|二叉树3
我来举一个典型的例子如题:完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。完全二叉树(一)如图:完全二叉树(二)如图:可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。
2023-12-25 22:24:58 985
原创 代码随想录算法训练营DAY15|二叉树2
node->right) { // 当左右孩子都为空的时候,说明是最低点的一层了,退出。// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的。本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了。
2023-12-24 23:08:37 845
原创 代码训练营算法训练DAY14|二叉树1
写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定每一层递归需要处理的信息。
2023-12-24 02:07:00 851
原创 代码随想录算法训练营DAY13|栈与队列3
寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描)我们来看一下C++代码:public:// 小顶堆public:// 要统计元素出现频率// map<nums[i],对应出现的次数>i++) {// 对频率排序// 定义一个小顶堆,大小为k// 用固定大小为k的小顶堆,扫面所有频率的数值it!it++) {
2023-12-11 23:07:06 919 1
原创 代码随想录算法训练营DAY11|栈与队列2
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例 2:输入: "()[]{}"输出: true示例 3:输入: "(]"输出: false示例 4:输入: "([)]"输出: false示例 5:输入: "{[]}"输出: true。
2023-12-10 23:05:13 844 1
原创 代码随想录算法训练营DAY10|栈与队列1
C++优化代码public:size--;while (size--) { // 将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部que.pop();// 此时弹出的元素顺序就是栈的顺序了que.pop();时间复杂度: pop为O(n),其他为O(1)空间复杂度: O(n)
2023-12-09 21:42:52 860
原创 代码随想录算法训练营DAY9|字符串2
题目链接/文章讲解/视频讲解:代码随想录题目链接/文章讲解/视频讲解:代码随想录题目链接/文章讲解:代码随想录文章讲解:代码随想录
2023-12-07 09:52:44 409
原创 代码随想录算法训练营DAY8|字符串1
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1: 输入:["h","e","l","l","o"] 输出:["o","l","l","e","h"]示例 2: 输入:["H","a","n","n","a","h"] 输出:["h","a","n","n","a","H"]
2023-12-06 23:48:18 1822 1
原创 代码随想录算法训练营DAY3|链表1
题意:删除链表中等于给定值 val 的所有节点。示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]示例 2: 输入:head = [], val = 1 输出:[]示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]这里以链表 1 4 2 4 来举例,移除元素4。
2023-12-05 22:05:40 907
原创 代码随想录算法训练营day7|哈希表2
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3)。满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]// 对nums[left]和nums[right]去重。
2023-12-05 15:51:35 875
原创 代码随想录算法训练营DAY6|哈希表1
本题其实有四个重点:为什么会想到用哈希表哈希表为什么用map本题map是用来存什么的map中的key和value用来存什么的把这四点想清楚了,本题才算是理解透彻了。不看题解直接做有些吃力唉,拉了好几天进度了。
2023-12-05 00:25:13 824
原创 代码随想录算法训练DAY2|数组2
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]示例 2:输入:nums = [-7,-3,2,3,11]输出:[4,9,9,49,121]
2023-12-02 23:01:54 874
原创 代码随想录算法训练DAY1| 数组理论基础、704.二分查找、27.移除元素
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。不要使用额外的数组空间,你必须仅使用。,如果目标值存在返回下标,否则返回。的元素,并返回移除后数组的新长度。个元素有序的(升序)整型数组。易错点:左右边界记得自增或自减。易错点:记得用双指针。
2023-11-29 21:23:22 496
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人