- 博客(28)
- 收藏
- 关注
原创 代码随想录训练营 day36,37 | Leetcode406 根据身高重建队列、LeetCode452 用最少数量的箭引爆气、LeetCode56 合并区间、LeetCode738 单调递增的数字
对于按照区间右端点排序,当两个比较的区间存在重叠时,无需比较右端点的大小, 因为按照右端点排序, 后者肯定大于前者,因此只需保留右端点(前者)小的区间(对应结束时间早的区间)。对于按照区间左端点排序,当两个比较的区间存在重叠时,再比较区间右端点的大小,保留右端点小的区间(对应结束时间早的区间),这样能够满足剩余非重叠区间的个数最多。想象中,气球是按照区间从大到小摆放的,但数据给的顺序不是,为了方便查找相邻的区间,需要将数组进行排序,使得气球的区间的顺序也是按照从大到小的顺序排列的。
2024-06-14 01:22:42 1027
原创 【代码随想录算法训练营第三十五天】 | 1005.K次取反后最大化的数组和 134.加油站 135.分发糖果
这种思路的想法是比较直觉的,问题在于这个加油站是环形的,怎么证明从不同的起点出发,无论能不能走完全程,全局最低点的位置是不变的。这个结论的前提条件有点多,但题目都满足:1、环形的数组。2、起点可以变化,但数组中的元素及其顺序是固定的。换句话说,我们在分析累积和时并没有改变任何元素的值,只是改变了它们被累加的起始点和顺序。3、数组的总和要大于0,即题目要求的有解,且必须是唯一解,多解的话这个解法失效,需要添加额外的判定条件。4、环形数组中的元素是连续分布的,并且在整个分析过程中保持不变。
2024-06-13 22:31:51 926
原创 【代码随想录算法训练Day32】122.买卖股票的最佳时机 55.跳跃游戏 45.跳跃游戏II
这里贪的是走到已知的最远距离,不是该格子能到的最远距离。这题简单说就是一开始我们知道能走一段距离,我们在已知的能走到的区域中,每走一步能知道当前点能到的距离,我们要做的是寻找还能走到的最远的距离,然后更新我们已知的最远距离,再在这个距离里找下一个能跳到的最远的距离。关于步数的计算,每次寻找完后可以看作是直接走到了已知的最远,知道了新的能到的最远,可以直接到达新的最远,这里步数+1,然后在新到达的最远的距离的格子又得知了一段新的最远,接着再在这段新的已知距离中找下一个最远再直接跳。45.跳跃游戏 II。
2024-06-10 01:36:13 667
原创 代码随想录算法训练营 day31 | 455.分发饼干 376.摆动序列 53.最大子数组和
暴力是O(n^2)的,为了降低时间复杂度,回看题目,连续数组的问题,尝试滑动窗口,滑动窗口其实就是双指针的应用之一,是有效的将 n^2 降到 n 的方法。使用前缀和数组,我们就可以将寻找最大和的连续子数组的问题转换成在前缀和数组中,寻找 i, j (i < j)区间下标,使得区间的和最大,即将原来的问题转换成了,寻找前缀和数组中的最小值,以及最大值,两者的差就是区间和。后面看了题解,挺多是按照动态规划解的,暂时还不会,卡哥这个题解也挺好的,这个解法不用去重,省下了一个o(n)的时间。
2024-06-08 23:25:54 1217
原创 day30 | LeetCode 332.重新安排行程、LeetCode 51.N皇后、LeetCode 37.解数独
我们化简本题题意:给定一个 n 个点 m 条边的图,要求从指定的点出发,经过所有的边恰好一次可以理解为给定起点的「一笔画」问题。本体的附加的要求是这个一笔画的路径需要是路径的字典序最小。别看名字唬人,但这题其实思路挺清晰的,先用邻接表建图,然后在图中深搜,搜索过程中将走过的边(邻接关系)删除。标记不能放的位置,for 循环内每放置一个皇后就将该行以下的不能放的位置标记,然后递归到下一层遍历。这题大体思路和以前的是差不多的,但实现细节出现了问题,我最开始是采用的思路是用 used 数组。
2024-06-07 01:36:07 569
原创 【代码随想录算法训练营第二十九天】| LeetCode491 非递减子序列、LeetCode46 全排列、LeetCode47 全排列Ⅱ
used[i-1] == false 的含义:只有当递归回溯回进到 for 循环的下一个 i 时,才可能出现 i-1 和 i 的值相等,但 used[i-1] 的标记时 false 的情况,即当前处于同一递归层级中。思路:本质是多个循环嵌套,一个一个选数,判断是否是递增的,但由于存在重复元素,需要使用used 来辅助判断是否选择过,这个重复元素。函数内部而不是全局变量,主要是因为需要保证每个递归调用层级的状态是独立的,尤其是在处理需要在每个递归层级避免重复元素时。
2024-06-06 01:04:54 577
原创 【代码随想录算法训练Day28】LeetCode 93. 复原 IP 地址、LeetCode 78.子集、LeetCode 90.子集II
先一直走选的分支,再回溯到上一层,这时选的元素在结果集中,我们将它pop出来,这样就是不选了,然后再进一次backtracking,走不选这个元素的分支。先选,放进path结果集,走选的分支,然后回溯回来,pop出去当前的元素,走 for 循环,进到下一个元素,这时也是没选当前元素,走到下一个元素了。对于前导0,我是通过先将字符串转换成整型,这样就得到一个没有前导0的子串对应的值了,再将整型转换回字符串,如果字符串转换前后不一致,则说明有前导0,这种情况要去除。使用和分割回文串同样的思路,以 '
2024-06-04 20:32:02 681
原创 【代码随想录算法训练营第二十七天】 | LeetCode39 组合总和、LeetCode40 组合总和Ⅱ、LeetCode131 分割回文串
在处理组合问题的时候,递归参数需要传入 start,表示下一轮递归遍历的起始位置,这个 start 就是切割线。表示从这里往前的字符串是处理完毕的,从 start 开始到 i 的这段子串是接下来要判断处理的。
2024-06-04 00:50:49 924
原创 【代码随想录算法训练营day24】| 回溯理论基础、77.组合
穷举所有可能,最简单的是写n层循环,遍历所有可能。但这么写太复杂了,n层得写到昏,这时就可以用递归,也就是回溯来解决这n层循环的问题。在模板中我们能看到,这个递归函数中有for循环,这个递归函数其实就是通过递归每次都会进这个for循环,在循环中再调用递归函数,达到实现n层循环嵌套的效果。
2024-05-31 23:53:46 252
原创 【代码随想录Day23】|669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
看完题解,才发现还能 右中左 这样遍历,被学过的知识锁住了,其实这很简单就能想到,左中右 中序遍历,能从小到大输出,那么 右中左 则是能从大到小输出。这题翻译过来,要做的是找到小于low的节点,删除该节点及其左子树,将右子树连到该节点的父节点;这题最开始的想法是复用删除节点的那题的思路做,需要修改的部分就是要让程序删除完一个点后继续遍历,因为后续可能还有不符合条件的节点。这题在力扣平台上跑有点小问题,如果删除节点的话会报错,但在本地的ide上运行是不会有问题的,这应该是平台的问题。以下是找到的解释的博客。
2024-05-31 01:00:51 587
原创 【代码随想录算法训练Day22】LeetCode 235.二叉搜索树的最近公共祖先、LeetCode 701.二叉搜索树中的插入操作、LeetCode 450.删除二叉搜索树中的节点
这题的技巧在于,在二叉搜索树中插入节点的操作,插入的节点可以直接当作都是叶子节点,只要遍历二叉搜索树,找到满足二叉搜索树性质的空节点 插入元素就可以了,这样插入节点并不会影响整棵树的性质,还省了维护的过程。本题使用 二叉树的最近公共祖先 这题的代码同样能解,但本题的给出了额外的可利用的信息,这棵树是二叉搜索树,利用这个信息可以减少搜索的复杂度。但其实,更常见的删除思路是用其右子树中的最小节点(或左子树中的最大节点)来替换要删除的节点,然后删除那个最小(或最大)节点。本题是二叉搜索树,二叉搜索树是有序的,
2024-05-29 21:18:10 563
原创 【代码随想录算法训练营第37期 day21 | LeetCode530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先】
当count计数到和maxcount相等的时候,说明这个数的个数已经是已知的最大了,先将该数认为是众数,输出到结果集中,如果后续有更大的,再清空结果集,重新记录众数。也就是说最小的差值只会在两两做差中产生,其他的两个元素的差值能转换成连续的差值的和,这显然不是最小的,所有我们只需要计算 i-1 和 i 的两个节点的差值,并记录这些差值的最小值即可。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。
2024-05-29 00:32:02 1695
原创 leetcode.560.和为k的子数组, 76.最小覆盖子串
我们可以用一个哈希表表示 t 中所有的字符以及它们的个数,再用一个哈希表动态维护窗口中所有的字符以及它们的个数,如果这个动态表中包含 t 的哈希表中的所有字符,并且对应的个数都不小于 t 的哈希表中各个字符的个数,那么当前的窗口是「可行」的。这个技巧在生活中运用也挺广泛的,比方说,你们班上有若干同学,每个同学有一个期末考试的成绩(满分 100 分),那么请你实现一个 API,输入任意一个分数段,返回有多少同学的成绩在这个分数段内。注意:这里 t中可能出现重复的字符,所以我们要记录字符的个数。
2024-05-28 00:24:13 1881
原创 【代码随想录算法训练Day20】LeetCode 654.最大二叉树、LeetCode 617.合并二叉树、LeetCode 700.二叉搜索树中的搜索、LeetCode 98.验证二叉搜索树
建树的基础操作.
2024-05-27 23:40:51 225
原创 【代码随想录算法训练营第37期 】day18 | LeetCode513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树
这里将回溯的逻辑详细的写出来了,但由于在传参数的时候可以传 count - cur->left->val,这样的写法不会改变当前层(节点) 的count值,所以回溯到当前节点进行另一子树的递归时,可以保证当前回溯到该节点的count的正确性。这样写就隐藏了回溯的逻辑,以前写都没有注意这点,以后写之前需要思考一下回溯的问题。递归函数什么时候需要返回值?什么时候不需要返回值?这题就是递归函数不需要返回值的题型。这题的要求是找所有符合条件的路径,所以不能碰到符合条件的就直接返回,还需要继续搜索。
2024-05-26 00:39:48 508
原创 【代码随想录37期】Day17 平衡二叉树、二叉树的所有路径、左叶子之和
在选择前序遍历或后序遍历来处理树的相关问题时,关键在于理解何时需要先访问父节点的信息,何时需要从子节点收集信息后再处理父节点。这两种遍历策略的选择依赖于问题的具体需求和数据的流向。下面详细讨论这两种情形。
2024-05-25 00:38:06 462
原创 代码随想录37期】Day16 二叉树的最大,最小深度 、完全二叉树的节点个数
打卡记录二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
2024-05-23 18:15:37 349 1
原创 【代码随想录37期】Day15 层序遍历、翻转二叉树、对称二叉树
打卡记录dfs -----> 为了实现dfs遍历树,需要使用栈这种数据结构作为辅助,将当前节点入栈,处理栈中节点,将该节点左右孩子入栈。由于栈的先进后出的特性,能保证是一直处理一边的孩子,再处理另一边的孩子,这就和深度优先搜索的思想是吻合的,所以采用栈作为辅助结构来实现dfs的树的遍历。我暂且先记作是深度优先搜索的一种实现方式。bfs -----> 为了实现bfs遍历树,使用队列这种数据结构作为辅助,将当前节点入队列,处理栈中节点,将该节点左右孩子入栈。
2024-05-22 23:14:40 346 1
原创 【代码随想录37期】Day14 二叉树的前序遍历、二叉树的中序遍历、二叉树的后序遍历
打卡记录使用栈和标记方法(无论是颜色标记还是nullptr标记)来实现二叉树的前序、中序和后序遍历的代码可以很容易地进行调整,主要因为这些方法允许我们显式地控制每个节点访问的顺序。这种控制是通过决定何时将节点推回栈中来实现的,以及决定何时读取或输出节点的值。
2024-05-22 01:18:42 1994 1
原创 【代码随想录37期】Day09 KMP
那么,我们发现aabaa这个子串,他的后缀——aa,与匹配串aabaaf的前缀——aa,是匹配的,当然,a与a同样也是匹配的,但我们一眼就能看出aa是目前最长的,我们能跳过的已经匹配的部分。我们一眼看出来的部分,就是子串的前缀与后缀中,最长的那个字符串,也就是常说的。列个表就很明显了,aabaa的后缀为{a, aa, baa, abaa},aabaaf的前缀为{a, aa, aab, aaba, aabaa},很明显,两个集合的交集只有{a, aa},这个交集中最长的元素是aa,这就是我们要找的东西。
2024-05-17 02:01:31 894
原创 【代码随想录37期】Day08 反转字符串、反转字符串Ⅱ、替换数字、反转字符串里面的单词、右旋转字符串
打卡记录而从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。
2024-05-16 00:17:37 266
原创 代码随想录37期|LeetCode 454.四数相加II,LeetCode 383. 赎金信 ,LeetCode 15. 三数之和 ,LeetCode 18. 四数之和
拆分的时候可以考虑时间复杂度了,如果拆成1,3,即定一个数去找符合的b+c+d,这样就是一个一层的循环和一个三层的循环,总复杂度是立方的。但拆成2,2,这样就是写成两个两层循环,总的就是2n²的,时间复杂度会低。不要对于时间复杂度太苛刻,有些题的时间复杂度就是会到n^2甚至是n^3的,没法再优化或者说这样就已经符合ac的条件了,不要一上来就想着怎么能用nlogn,n之类的复杂度来思考,有些题就是做不到,这样只会浪费时间,当作学习的话另说。这两题是用的双指针来解决的,这种类型的题的思路都是。
2024-05-15 00:25:48 305
原创 【代码随想录37期】Day06 有效的字母异位词、两个数组的交集、快乐数、两数之和
打卡记录,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。除数组外常用的用作哈希法的数据结构。
2024-05-13 23:05:27 243
原创 【代码随想录37期】Day03 移除链表元素、设计链表、反转链表
反转链表的递归写法,反转的过程其实就是读取元素进栈的一个过程,用递归写如下所示。前俩基础知识,没啥记录的。
2024-05-11 01:56:54 225
原创 代码随想录算法训练营第二天 977 有序数组的平方 209 长度最小的子数组 59 螺旋矩阵II
209 记录一下滑动窗口的思想,先往右移动区间右端点指针,判断当前窗口(两指针所构成的区间)是否符合条件;若符合条件,说明当前区间的值加起来是大于target的,为了找到最小区间长度,尝试将区间左端点指针向右移动,缩短区间长度,看构成的区间是否仍然符合条件;977 这题的重点在于看出平方后的数组的特性,大的数只会出现在两端,越往中间数越小,所以使用双指针从两头往中间走,只用比较两头的数谁大即可,哪个大就进vector,然后进数组的一段的指针往中间移动,判断下一个两端谁大。
2024-05-10 01:01:58 110
原创 代码随想录算法训练营第一天 704 二分查找、27 移除元素
对middle的判断完成后,在left和right变化的时候,因为定义方式是包含区间两端元素,所以可以直接-1,+1,这样做依然会使得下一个区间的元素个数没有错误。左闭右开定义的区间,如[1,2),这种形式的,因为右边是开的,所以区间内元素个数是不包括这个数的,所以最开始的right的赋值需要是nums.size。左闭右闭的写法因为,允许存在[1,1]这种区间,所以最开始的right的赋值需要是nums.size-1。之前一直是用的左闭右闭的区间定义的来做的题,一直没意识到区间的开闭会影响,这次看完。
2024-05-08 21:06:44 222
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人