<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[scorecpl的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/scorecpl</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; scorecpl]]></copyright><item><title><![CDATA[代码随想录算法训练营55期第35天｜动态规划part03]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/146036779</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/146036779</guid><author>scorecpl</author><pubDate>Thu, 06 Mar 2025 03:37:08 +0800</pubDate><description><![CDATA[背包空出物品i的容量后，背包容量为j - weight[i]，dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值，那么dp[i - 1][j - weight[i]] + value[i] （物品i的价值），就是背包放物品i得到的最大价值。dp[i][j]代表当背包容量为j时， 把下标为[0，i]的物品任取放入背包，背包的最大价值。：背包容量为j，里面不放物品i的最大价值是dp[i - 1][j]。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第33天｜动态规划part02]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145942253</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145942253</guid><author>scorecpl</author><pubDate>Tue, 04 Mar 2025 12:01:38 +0800</pubDate><description><![CDATA[dp[i][0]一定都是1，因为从(0, 0)的位置到(i, 0)的路径只有一条，同理，dp[0][j]也都是1。从[1][1]开始从左到右，从上一层到下一层遍历。dp[i][j代表到达该格子的路径数量。和62类似，只是需要处理障碍的情况，保持障碍处。机器人每次只能向下或者向右移动一步,5 举例推导dp数组。3 dp数组如何初始化。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第32天｜动态规划part01]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145918207</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145918207</guid><author>scorecpl</author><pubDate>Fri, 28 Feb 2025 14:35:03 +0800</pubDate><description><![CDATA[先模拟一下怎么爬楼梯，一层楼梯只有一种方法，二层楼梯可以一步一层或者两步一层，两种方法。dp[i - 1] 上1层楼梯可以到dp[i]，dp[i - 2]一步跳两个台阶到dp[i]，确定递推公式： dp[i] = dp[i - 1] + dp[i - 2];dp数组如何初始化 ： dp[0] = 0, dp[1] = 0。确定dp数组： dp[i]代表第i个数的斐波那契数值。dp[i]代表爬到第i层的最小花费。dp[i]代表爬到第i层的方法。5 举例推导dp数组。5 举例推导dp数组。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第31天 ｜贪心算法part05]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145898001</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145898001</guid><author>scorecpl</author><pubDate>Thu, 27 Feb 2025 13:08:54 +0800</pubDate><description><![CDATA[题目规定“a node can monitor its parent, itself, and its immediate children.”  而且通过example的图例里看出，摄像头没有设置在root 和Leaf上。对于二叉树来说，下一层的节点个数是本层节点的两倍，头结点放不放摄像头也就省下一个摄像头， 叶子节点放不放摄像头省下了的摄像头数量是指数阶别的。所以要从叶子节点开始，给期父节点是指摄像头，然后不断向上，直到到达头节点。和昨天三道重复区间的思路一致。从下向上遍历其实就是后续遍历。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第30天 ｜贪心算法part04]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145868110</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145868110</guid><author>scorecpl</author><pubDate>Wed, 26 Feb 2025 13:17:51 +0800</pubDate><description><![CDATA[思路： 只要气球的x坐标范围有重叠，就可以一箭击中。所以可以将数组按照xstart 进行排序。遍历数组，不断更新射击范围，只要做范围的left 小于right，说明气球左边范围重叠，否则没有重叠部份，要增加一箭。与上一道题类似， 也是需要找到步重复的区间，不同的是interval重叠的定义，这道题点明了“，这时候count需要加一。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第29天 ｜贪心算法part03]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145842921</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145842921</guid><author>scorecpl</author><pubDate>Tue, 25 Feb 2025 11:46:25 +0800</pubDate><description><![CDATA[每个加油站的剩余量为gas[i] - cost[i], 从station 0开始累加剩余量，一旦累积剩余量小于零，说明说明[0, i]区间都不能作为起始位置，要从 i+ 1开始算起始位置，从零开始累加剩余量。暴力解法很容易思考，一个for loop从头到尾遍历station，对每一个station为起点，用while loop模拟环形遍历，只要所有station剩余油亮加上当前station的油量足够行驶到下一个station，该station就是起点。消耗一个10和一个5，如果不够，消耗三个5。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第27天 ｜贪心算法part02]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145840025</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145840025</guid><author>scorecpl</author><pubDate>Tue, 25 Feb 2025 08:12:52 +0800</pubDate><description><![CDATA[将数组排序，先从左到右，把负数翻转为正数（如果有负数）， 如果负数全部变为正数后，k还递减味0， 因为 “ You may choose the same index multiple times.” 所以可以将最小的正数反复翻转，直到完成k次翻转。这道题的难点在于是否能转换思维，不纠结于跳到哪个位置，而是跳跃的最大覆盖范围，只要范围最后能到达终点，就return true。如果移动下标达到了当前这一步的最大覆盖最远距离了，还没有到终点的话，那么就必须再走一步来增加覆盖范围，直到覆盖范围覆盖了终点。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第26天 ｜贪心算法part01]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145825903</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145825903</guid><author>scorecpl</author><pubDate>Mon, 24 Feb 2025 13:05:43 +0800</pubDate><description><![CDATA[靠自己手动模拟，如果模拟可行，就可以试一试贪心策略，如果不可行，可能需要动态规划。先将饼干数组和小孩数组排序。然后遍历小孩数组，用小饼干先喂饱胃口小的，并统计满足小孩数量。贪心的本质是选择每一阶段的局部最优，从而达到全局最优。先把代码写了，明天再总结吧。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第25天 ｜回溯算法part04]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145775905</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145775905</guid><author>scorecpl</author><pubDate>Mon, 24 Feb 2025 12:35:06 +0800</pubDate><description><![CDATA[因为满足条件的子集时增序的，所以数组必须保持原有顺序，但是元素不能重复使用，所以和之前的题目一样，需要startIndex标记下一层开始的位置。N皇后这道题目还是很经典的，一刷的录友们建议看看视频了解了解大体思路 就可以 （如果没时间本次就直接跳过） ，先有个印象，二刷的时候重点解决。子序列不一定是数组中连续元素的子集，所以在递归时，即使找到了符合条件的子序列，也不要返回，要继续下一层的遍历。同样，一刷的录友们建议看看视频了解了解大体思路（如果没时间本次就直接跳过），先有个印象，二刷的时候重点解决。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第24天 ｜回溯算法part03]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145768023</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145768023</guid><author>scorecpl</author><pubDate>Fri, 21 Feb 2025 13:54:41 +0800</pubDate><description><![CDATA[每一层就是一次分割，我们依次尝试分割的位置，然后判断被分割出来的部份是否合法，如果不合法，就return，合法就进入下一层递归，也就是下一次分割。当分割次数达到3时，验证第四段是否合法。合法就加入到结果集，否则return。这道题依然去需要startIndex， 因为分割的位置不重复。ip地址由四个部分组成，所以需要分割三次，我们需要一个变量记录分割的次数。这道题是切割问题，通过回溯，把满足条件的切割方法找出来。写完之后发现代码随想录有优化的代码，周末再看看吧。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第23天 ｜回溯算法part02]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145740298</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145740298</guid><author>scorecpl</author><pubDate>Thu, 20 Feb 2025 10:19:09 +0800</pubDate><description><![CDATA[依然使用递归三部曲， 两个全局变量，一个存放结果，一个存放符合条件的元素集合。与39类似，但是candidates里包含包含重复的元素，而且每个数字在组合中只能使用一次。类似于组合问题，寻找切割点，但是切割过的地方不能重复切割，所以需要startIndex。如果是多个集合取组合，各个集合之间相互不影响，那么就不用startIndex。动态规划优化回文串判断的解法，周末查缺补漏的时候理解之后再写一遍代码。需要一个函数判断是否是palindrome，使用双指针法。的话，就需要startIndex。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第22天 ｜回溯算法part01]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145719296</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145719296</guid><author>scorecpl</author><pubDate>Wed, 19 Feb 2025 13:47:34 +0800</pubDate><description><![CDATA[回溯是递归的副产品，只要有递归就会有回溯。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第21天 ｜ 二叉树part08]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145679730</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145679730</guid><author>scorecpl</author><pubDate>Mon, 17 Feb 2025 12:35:29 +0800</pubDate><description><![CDATA[这道题本质是找到分割点，然后递归左区间和右区间。需要时平衡的二叉搜索树，所以分割点就是数组中间位置的节点。如果数组长度为偶数，取两个中间节点的任意一个都可以。在递归时，需要确定左区间和右区间的范围，所以需要重新定一个递归函数。区间为左闭右闭，所以当left > right时， 递归结束。二叉树的结构使得绝大部分的二叉树问题都可以用递归来解决。按照右中左的顺序遍历，需要pre来记录前一个访问的节点进行累加。对节点进行操作时，可能需要一个pre指针记录前一个访问的节点。2、终止条件是什么？3、单层逻辑是什么？]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第十九天 ｜ 二叉树part07]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145645213</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145645213</guid><author>scorecpl</author><pubDate>Mon, 17 Feb 2025 11:45:18 +0800</pubDate><description><![CDATA[从root开始，从上向下遍历，找到满足条件的节点就是最近公共祖先。这道题虽然是中等题，但是其实做法很简单，就是按照二叉搜索树的规则去遍历，遇到空节点插入。5、删除节点的左右子树都不为空，将左子树安置到右子树最左边节点的左子树。思路： 题目点明是二叉搜索树，那么解题一定会用到二叉搜索树的特征。1、遍历到空节点，也就是没找到需要删除的节点，直接返回。2、删除节点左右子树为空，直接删除节点，返回null。3、删除节点左子树为空，删除节点，返回右子树。4、删除节点右子树为空，删除节点，返回左子树。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第十八天 ｜ 二叉树part06]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145623832</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145623832</guid><author>scorecpl</author><pubDate>Fri, 14 Feb 2025 23:50:59 +0800</pubDate><description><![CDATA[遇到在二叉搜索树上求什么最值，求差值之类的，都要思考一下二叉搜索树可是有序的，要利用好这一特点。在递归遍历的过程中记录前后两个指针这个小技巧501.二叉搜索树中的众数和 530差不多双指针思路，不过 这里涉及到一个很巧妙的代码技巧。如果 频率count 等于 maxCount（最大频率），当然要把这个元素加入到结果集中频率count 大于 maxCount的时候，不仅要更新maxCount，而且要清空结果集，因为结果集之前的元素都失效了。int count;pre = null;]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第十七天 ｜ 二叉树part05]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145603045</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145603045</guid><author>scorecpl</author><pubDate>Thu, 13 Feb 2025 05:48:18 +0800</pubDate><description><![CDATA[左子树上所有结点的值均小于它的根结点的值，右子树上所有结点的值均大于它的根结点的值， 而且左、右子树也分别为二叉搜索树。了解二叉搜索树的特征就知道，二叉树的数值是有序的，inorder遍历其实是把二叉树当成为有序数组遍历， 在这个过程中统计数组的最小差值。构造树一般采用的是前序遍历，因为先构造中间节点，然后递归构造左子树和右子树。递归终止条件： 当nums[] 长度 == 1， 也就是到达了叶子节点。以相同的顺序遍历root1和root2， 直接在root1二叉树上操作。3、最大值的下标右区间构造右子树。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第十六天 ｜ 二叉树part04]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145583550</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145583550</guid><author>scorecpl</author><pubDate>Thu, 13 Feb 2025 02:57:53 +0800</pubDate><description><![CDATA[每递归到下一层，最大深度值都会更新，不论使用什么遍历，只要保证先左后右的顺序，第一次更新最大深度时，访问的节点就是该层最左的节点，记录该节点的值。之后虽然会访问同层的其他节点，但是最大深度不再更新，其他节点的值不会被记录。先用中序和后序数组把二叉树画出来，发现后序数组的最后一个元素是root，通过这个root我们能在中序数组中把左子树和右子树分隔出来，然后用递归处理左子树和右子树。思路：这道题要再最后一行 找到最左边的值， 第一反应是用BFS, 遍历每一行都记录第一个值，那么最后一个值就是树左下角的值。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第十五天 ｜ 二叉树part03]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145561936</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145561936</guid><author>scorecpl</author><pubDate>Tue, 11 Feb 2025 05:54:05 +0800</pubDate><description><![CDATA[首先确定题意，左叶子首先是leaf， 而且是其parent的left child，所以这道题就是遍历所有node，通过父节点找到符合要求的左叶子。优化：如果在某一个节点，左右子树已经不平衡了，也就是高度差大于1，没有比较继续计算高度，直接返回-1，表示该树不是二叉平衡树。定义一个新的递归函数，节点，路径和结果集作为参数，不需要返回值。递归求取左子树左叶子之和，和 右子树左叶子之和，然后返回数值之和。这道题使用递归和回溯， 在遍历的过程度，记录遍历的节点，到达leaf 时，将结果放入。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营55期第十四天 ｜ 二叉树part02]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145540335</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145540335</guid><author>scorecpl</author><pubDate>Tue, 11 Feb 2025 01:00:49 +0800</pubDate><description><![CDATA[左节点的左孩子，右节点的右孩子比较外侧，传入左节点的右孩子，右节点的左孩子比较内侧， 如果左右都对称就返回true ，有一侧不对称就返回false。我的思路： postorder遍历，把已经翻转的left 和已经翻转的right进行翻转，用recursion的方法是最简单的。先思考下什么样的树是对称的，需要左边外侧的node 和右边外侧的node相等，左边内侧和右边内侧的node 相等。如果为空节点的话，就返回0，表示高度为0。前序遍历和后序遍历都可以，前序求的是深度，后序求的是高度。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第十二天｜二叉树 part01]]></title><link>https://blog.youkuaiyun.com/scorecpl/article/details/145505020</link><guid>https://blog.youkuaiyun.com/scorecpl/article/details/145505020</guid><author>scorecpl</author><pubDate>Sat, 08 Feb 2025 05:08:36 +0800</pubDate><description><![CDATA[其中preorder最简单， 先让right child 入栈，再让left child 入栈，出栈时，就是 left child --> right child 的顺序。思路： 用queue 逐层地，从左到右储存节点，然后依次弹出，记录节点的值，并把左右child 继续储存到queue。顺序存储 ： 用数组， 如果父节点的数组下标是 i，它的左孩子是 i * 2 + 1，右孩子是 i * 2 + 2。通过标记， 代码可以统一，只是push 左中右node的顺序不同。思路： 标记出要处理的节点，统一。]]></description><category></category></item></channel></rss>