- 博客(25)
- 资源 (1)
- 收藏
- 关注
原创 代码随想录训练营第29天|控制变量
cur用来累计新的起点下,所有油站的净利, 如果累计到i【首次】出现负值,则符合要求的起点一定在i后面。反证法:假设i之前存在一个符合题意的起点j(old_start
2024-09-11 13:45:08
467
原创 代码随想录训练营第28天|利润分解
第1步处理后,i指向原始数组(排序后)的第一个非负数,在原始数组中已然最小,但考虑到操作1同时会生成新的正数,甚至小于nums[i],所以nums[i-1]也要加入候选,修改较小的元素。在可达范围内(max_range)步进,每次移动后尝试更新max_range,直到所有元素被处理完,此时如果max_range仍未覆盖终点,说明终点不可达,返回false。1.先对nums排序,对于负数,排在越前的,绝对值越大,越要优先反号,带来的收益最大。dp[i]表示跳跃至下标为i的位置所需的最小步数。
2024-09-10 10:58:30
247
原创 代码随想录训练营第25天|set去重
nums不能排序,所以无法用while在回溯后去重,只能借助set,记录当前层已经使用过的数值,通过count方法实现去重。排列需要考虑顺序,不能用startIdx递增搜索,通过标记数组used,搜索每一层未使用过的元素。本题nums可以进行排序,所以回溯后利用while过滤掉相同数值,即可实现去重。
2024-09-07 10:24:17
266
原创 代码随想录训练营第24天|回溯过程收集
ip最多4段,所以根据path.size()终止回溯,此时如果字符串被切割到末尾,则是一个有效的分割。另外,每一段最大255,所以子串长度最大为3,据此可以进行剪枝。遍历的过程收集结果即可。
2024-09-07 09:06:03
220
原创 代码随想录训练营第23天|回溯去重
因为可以重复选取,所以递归的下一个数字的搜索起点(startIdx)是i,而非i+1。回溯之后,相同数值的元素直接跳过,实现本层去重功能。
2024-09-05 11:04:43
282
原创 代码随想录训练营第22天|回溯剪枝
减枝策略:i不能太大,否则无法凑够k个元素,当前已收集元素个数:path.size(),待收集个数:k-path.size(),终点最大为(开区间): n+1,得到起点最大:n+1-(k-path.size())。剪枝策略:i不能太大,考虑两个限制:1.满足组合个数要求,如果i太大,无法凑到k个元素 2.满足求和要求,如果i太大,当前层已经突破了n,因为i是递增的(i++),所以后续的遍历都是无效的。
2024-09-04 08:57:59
194
原创 代码随想录训练营第21天|搜索树修剪前后序
题目要求累加>=root的值,结合搜索树中序(左->根->右)递增的特性,这里所以采用右->根->左的遍历方式,同时利用pre指针指向前置节点,实现前缀和的计算。解法一:修剪根节点,不能直接返回nullptr,因为子树仍可能存在符合要求的节点。考虑搜索树的特性,只需要对一个方向的子树递归即可。搜索树特性:中序遍历递增,即左
2024-09-03 12:06:05
153
原创 代码随想录训练营第20天|带返回值的递归
待查询的节点本身也需进path,解决p就是q的父节点的case。利用递归返回值,完成父子关系的绑定:下一层加入节点返回新树,本层用root->left或者root->right将其接住。
2024-09-02 11:50:53
195
原创 代码随想录训练营第15天|终止条件里的回溯
后续遍历的思路,比较绕的一点是左叶子的判定依赖父节点,从root出发,根据root->left->left/right来判断左子树是否是左叶子。终止条件里如果对temp进行更新,会导致回溯出问题, 因此额外创建了一个变量res。
2024-08-28 08:22:22
132
原创 代码随想录训练营第13天|中序遍历指针迭代
使用cur指针访问到树最左(【处理左】),用stack记录过程节点,当cur为空时,回溯上一节点,收集结果(【处理根】),再将cur指向右孩子(【处理右】),实现中序遍历。
2024-08-26 11:07:57
196
原创 代码随想录训练营第11天|类型推导/操作符重载
第二个while调整队尾, 数据不能太小,因为求窗口内最大值,所以凡是小于nums[i]的均无用,pop完毕后,实际就形成了单调递减队列,队首表征当前窗口最大值的索引。使用decltype自动推导cmp的类型,或者显示写出:function第一个while调整队首,数据不能太老,处理至i位,窗口起点i+1-k,比起点还小的无效;150. 逆波兰表达式求值。150. 逆波兰表达式求值。
2024-08-24 20:32:24
176
原创 代码随想录训练营第九天|KMP模式匹配
next为前缀表,next[i]记录截止到i(包括i)的字符串(pattern.substr(0,i+1))中,相同前缀后缀的最大长度。利用这个前缀表,可以让j指针高效定位,避免从头搜索。核心思想就是高效利用pattern的模式信息,提高搜索效率。必要性:假设原字符串AA,拼接后AAAA,掐头去尾后,拼接串中一定还可以找到原串。j指向前缀结尾(开区间),因为前缀一定从下标0开始,所以前缀长度=j-0=j。i指向后缀结尾(闭区间)使用双指针删除元素。
2024-08-22 10:14:59
187
原创 代码随想录训练营第七天|双指针
以上两种情况均应返回false,除此之外,表明当前字符可被正常构造,所有字符构造完毕后返回true。空间换时间,利用map将O(n^4)问题降为 O(n^2)访问一个不存在的key会自动插入该key,并将其值初始化为。2.magazine中出现过x,但已被消耗完毕。四数之和=暴搜前两位+两数之和(双指针)三数之和=暴搜首位+两数之和(双指针)1.magazine中从未出现过x。回溯解法,超时了Orz ..
2024-08-20 10:25:01
175
原创 代码随想录训练营第六天|vector与set相互构造
若先更新map、再查询,可能导致nums[i]被使用两次。反之,上述代码先查询再更新,index是利用0到i-1的元素构建,所以一定不会查到nums[i],从而不会出现重复选择的问题。set->vector, vector->set,可以利用迭代器直接构造。
2024-08-19 11:17:26
165
原创 代码随想录训练营第四天|快慢指针
利用套圈法判断成环,因为快指针每次走两步,慢指针每次走一步,追击速度是1,假设当前两指针距离为m,圈长为n,追击路程就是m+n,则经过(m+n)次运动,快慢指针一定相遇。2.如下图所示,若两链表不相交,则这两个指针遍历过程不会相遇(否则说明n中有环,不符题意),直到二者同时到达了末尾(nullptr),因为n+m=m+n;上式表明,两个指针分别从头结点和相遇处出发,每次运动一步,他们必在入环处相遇:k=1表示正好相遇,k>1表示套圈相遇。正序修改结果也对,但是修改过程存在成环的现象。
2024-08-17 16:37:19
345
原创 代码随想录训练营第三天|虚拟头
引入虚拟头,所以处于index的节点,需要从头结点出发,步进index+1次才能到达,插入/删除时,需要找到它的【前置节点】进行指针操作。使用虚拟头节点,避免删除元素在头部时处理逻辑不一致的问题。
2024-08-16 09:51:18
214
原创 代码随想录训练营第二天|滑动窗口
子数组:要求连续,考虑滑动窗口解法。right指针进行扩张,left指针进行收缩,对所有满足要求的长度取最小即可。按行求和、按列求和,切分的操作就是对【行(列)和】,求前缀和。恐怖如斯的代码掌控力。
2024-08-15 15:19:24
168
原创 代码随想录训练营第一天|双指针
原数组有序,平方后以0为界,依然可以得到两个有序数组,后续操作类似于归并。无法inplace操作,否则元素被覆盖。数组问题优先考虑双指针。
2024-08-15 13:41:12
214
matlab与C++混编教程
2016-03-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人