<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[evelynancyyy的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/evelynancyyy</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; evelynancyyy]]></copyright><item><title><![CDATA[代码随想录算法训练营第41天|01背包理论基础（二维）、01背包理论基础（滚动数组，一维）、416. 分割等和子集]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136698638</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136698638</guid><author>evelynancyyy</author><pubDate>Thu, 14 Mar 2024 14:14:50 +0800</pubDate><description><![CDATA[且本题只需要一个nums数组，既是背包问题中的价值数组value，也是重量数组weight。所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化！每种物品有“取”与“不取”两种状态。可以当作一个组合问题。经典的01背包问题，是求每个容量下的最大“价值”。而本题可看作，求每个容量下的最大承载“重量”。没什么好想法，之前没写过背包问题。，这里的n表示物品数量。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第40天|343. 整数拆分、96.不同的二叉搜索树]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136691693</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136691693</guid><author>evelynancyyy</author><pubDate>Thu, 14 Mar 2024 00:23:09 +0800</pubDate><description><![CDATA[思路：for循环上的剪枝，剪枝依据是，要想找到乘积最大的拆分方式，需要让拆出来的所有数字尽可能大小相似。所以，对于太大的 j ，可以直接跳过。其实第一反应是回溯……但感觉每层的集合都会很繁琐。递归公式的说明：求dp[i]可分成两种情况。剩下的，拆成3的和，直到剩下4或者不足3（！，但是这个结论需要数学证明其合理性。此处没有证明，而是直接用了结论。思路：本题也可以用贪心，]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第39天|62.不同路径、63. 不同路径 II]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136690521</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136690521</guid><author>evelynancyyy</author><pubDate>Wed, 13 Mar 2024 21:06:50 +0800</pubDate><description><![CDATA[从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出，一定是从左到右一层一层遍历，这样保证推导dp[i][j]的时候，dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。注意代码里for循环的终止条件，一旦遇到obstacleGrid[i][0] == 1的情况就停止dp[i][0]的赋值1的操作，dp[0][j]同理。row是行数，column是列数，vector<int>(column)是长度为列数的临时vector变量。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第38天|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136687502</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136687502</guid><author>evelynancyyy</author><pubDate>Wed, 13 Mar 2024 20:24:56 +0800</pubDate><description><![CDATA[申请一个长度为（n+1）的vector，用于记录整个dp数组。错误原因：我把编译环境选成C了，然而我写的C++程序。不需要长度为n+1的vector数组，只需要2个变量即可。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第32天|122. 买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136590584</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136590584</guid><author>evelynancyyy</author><pubDate>Mon, 11 Mar 2024 13:38:15 +0800</pubDate><description><![CDATA[这道题目关键点在于：不用拘泥于每次究竟跳几步，而是看覆盖范围，覆盖范围内一定是可以跳过来的，不用管是怎么跳的。把cover当作for循环的逻辑范围！（cover就是上述的maxIndex）的，那么本题就很容易了！（把利润分解为每天为单位的维度）总结：局部最优可以推出全局最优，找不出反例，试一试贪心！局部最优：收集每天的正利润；全局最优：求得最大利润。不过方法确实想了一会儿）“只收集正利润”就是贪心所贪的地方！]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第31天|贪心算法理论基础、455. 分发饼干、376. 摆动序列、53. 最大子数组和]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136583638</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136583638</guid><author>evelynancyyy</author><pubDate>Sat, 09 Mar 2024 20:44:36 +0800</pubDate><description><![CDATA[答：不会出现这样的情况。如果前一个元素是正数，而加了这个正数之后sum为负，说明在前一个元素（正数）时sum就已经为负了，于是会重新收集，矛盾。当sum为负数时，就从新收集元素，这难道不怕前一个元素是正数吗？“折线图”思想：可以把求“摆动序列”看成求折线图的转折点。可以用动态规划，但是此处不写，后续博客会再练习到这题。贪心：把小饼干分给小孩子，大饼干分给大孩子。记录一下错误代码（仅记录，这代码是错的！所以“前一个元素是正数”的假设不成立！关于“折线法”需要设定的（边界）条件。大饼干给大胃口，让大胃口先吃。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第29天|491.递增子序列、46. 全排列、47.全排列 II]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136565765</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136565765</guid><author>evelynancyyy</author><pubDate>Sat, 09 Mar 2024 09:53:37 +0800</pubDate><description><![CDATA[用一个used数组记录是否已经在该“树枝”上使用了该元素。在for循环中，如果该元素被用过了则跳过。用unordered_set记录已经访问过的元素值。在for循环中，如果已经访问过了，则跳过。错误代码：第二行，set会在每层循环结束时被释放！，vector的构造函数。正确代码：把set的定义写在for循环之外。，因为它们实际上得到的排列是完全一样的！，不会进行排序，且是没有重复元素的集合。，因为它已经包含了后面的所有情况！对于“记录每层使用过的元素”，可以用。aaa不会写，试了很久发现是错的。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第27天|93. 复原 IP 地址、78. 子集、90.子集II]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136562373</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136562373</guid><author>evelynancyyy</author><pubDate>Fri, 08 Mar 2024 16:30:50 +0800</pubDate><description><![CDATA[有重复元素且集合中可以有重复元素（不需要树枝去重），但又要求不能有重复集合（需要树层去重）。封装成一个完整函数，需要判断时调用即可。（要有封装的思想啊啊啊啊！所以，先写好求组合函数，然后直接在调用时求０～size长度的组合即可。子集问题可以看作：寻找所有可能长度的全部组合！，类似于分割回文串。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第26天|39. 组合总和、40. 组合总和 II、131.分割回文串]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136534211</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136534211</guid><author>evelynancyyy</author><pubDate>Fri, 08 Mar 2024 14:42:42 +0800</pubDate><description><![CDATA[时间复杂度: O(n * 2^n)，注意这只是复杂度的上界，因为剪枝的存在，真实的时间复杂度远小于此。虽然题目允许重复数字，但是为了不得到重复的组合，还是需要限制每次for循环的startIndex！一开始没有思路，因为不知道怎么”有规律“地分割。之后看了文章里的图，明白了。犯了经典错误，确实达成了一个元素只用一次，但是出现了重复的集合。，已经大于target，则该层循环直接跳过。如果当前的sum加上这层for循环会加上的。空间复杂度: O(target)之后写出来了，通过。关于判断是否回文串：（]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第25天|216.组合总和III、17.电话号码的字母组合]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136517055</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136517055</guid><author>evelynancyyy</author><pubDate>Thu, 07 Mar 2024 14:56:49 +0800</pubDate><description><![CDATA[直接套用“组合”问题的回溯框架，在找到符合规格的组合后判断它们的和是否符合题目。如果符合则记录，不符合则直接返回。我以为是：给出从2-9的某个范围，然后返回所有可能的数字排列对应的所有可能字母排列。代码中最好考虑这些异常情况，但题目的测试数据中应该没有异常情况的数据，所以我就没有加了。注意：输入1 * #按键等等异常情况（可通过字符转换为数字时，限制ASIIC码的范围）实际上是指，在给定的数字序列中，返回所有可能的字母排列。下面代码中，sum没有被回溯，导致错误。本题和”组合“问题的区别？]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第24天|回溯算法理论基础、77.组合]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136511706</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136511706</guid><author>evelynancyyy</author><pubDate>Wed, 06 Mar 2024 20:26:40 +0800</pubDate><description><![CDATA[回溯的本质是，其实就是一种暴力解法回溯法解决的问题都可以抽象为。因为回溯法解决的都是在集合中递归查找子集，。递归就要有终止条件，所以必然是一棵高度有限的树（N叉树）。回溯法三要素整体框架。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第18天|513. 找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136501817</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136501817</guid><author>evelynancyyy</author><pubDate>Wed, 06 Mar 2024 17:01:51 +0800</pubDate><description><![CDATA[上述代码每次都需要传入vector作为参数，但是实际上我们可以直接。类似于“返回所有的路径”的那题，属于深度问题，应该用前序遍历。层序遍历，记录下每层最左的元素（第一个元素）。看了代码随想录的手算方法，有了思路，最后ac。，然后利用vector本身的构造函数。思路：迭代法：（前序遍历）]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第17天|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136475237</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136475237</guid><author>evelynancyyy</author><pubDate>Wed, 06 Mar 2024 11:55:05 +0800</pubDate><description><![CDATA[所以，用vector存数字比较方便，这样可以一次性弹出数字。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第16天|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136433604</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136433604</guid><author>evelynancyyy</author><pubDate>Tue, 05 Mar 2024 12:29:21 +0800</pubDate><description><![CDATA[如果单纯只判断左右子树最小的值，那么如果左/右孩子中其中一个为NULL，则该结点不是叶子节点，但是返回给上层的值会是NULL对应的路径的值。二叉树节点的高度：指从该节点到叶子节点的最长简单路径边的条数或者节点数（取决于高度从0开始还是从1开始）二叉树节点的深度：指从根节点到该节点的最长简单路径边的条数或者节点数（取决于深度从0开始还是从1开始）是一种后序遍历的模式，用左右子树的高度的最大值，加一，作为当前节点的高度。树的最小深度：所有“叶节点“高度的最小值！所以，根节点的高度就是二叉树的最大深度。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第15天|102.二叉树层序遍历、层序遍历类型题目、226.翻转二叉树、101.对称二叉树]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136417181</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136417181</guid><author>evelynancyyy</author><pubDate>Sun, 03 Mar 2024 16:24:14 +0800</pubDate><description><![CDATA[其实方法三和方法四（队列和栈）本质上都是通过可存储的数据结构来暂存待处理的节点，主要是要确定入队列/栈的顺序，对于每层结点，提前统计当前queue中的元素个数size，然后用for循环遍历这size个元素。：（单纯的“优先向右遍历”是不行的，必须要层序遍历！）层序遍历，输出每层的最后一个元素。注：要事先记录下queue的size，因为que.size()在之后的过程中会改变！层序遍历，并用deque来记录每层节点，然后判断deque是否对称。：层序遍历，记录每层的和，和每层节点个数size。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第14天|二叉树理论基础、递归遍历、迭代遍历、统一迭代遍历]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136392406</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136392406</guid><author>evelynancyyy</author><pubDate>Sat, 02 Mar 2024 15:45:49 +0800</pubDate><description><![CDATA[①如果栈顶元素不为NULL，则右孩子先入栈（NULL则不入栈），然后自己入栈，然后NULL入栈，然后左孩子入栈（NULL则不入栈）。②如果栈顶元素为NULL，则说明下一个元素是需要输出的节点，那么弹出栈顶元素，把它的val加入result容器中。先序遍历是“根左右”，后序遍历是“左右根”。那么可以先按“根右左”遍历，再reverse翻转一下。知道手算方法，但是写成代码有困难。此后栈不为空则一直循环。最简单，因为遍历顺序和处理顺序相同。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第11天|20. 有效的括号 、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136230515</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136230515</guid><author>evelynancyyy</author><pubDate>Thu, 22 Feb 2024 22:27:04 +0800</pubDate><description><![CDATA[③每扫描到运算符，先将运算符栈中优先级“高于和等于”它的运算符依次弹出栈（到优先级小于它、或左括号、或栈空，为止），再把当前运算符压入栈。③每扫描到运算符，先将运算符栈中优先级“高于和等于”它的运算符依次弹出栈（到优先级小于它、或左括号、或栈空，为止），每弹出一个运算符，要从数字栈弹出两个运算数，把运算结果压入数字栈。①每当扫描到一个右括号，弹出栈顶元素，看是否是与该右括号匹配的左括号，不是则匹配失败，返回false。②整个字符串扫描完毕，如果栈不空，则说明有未匹配的左括号，匹配失败，返回false。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第10天|栈和队列理论基础、232.用栈实现队列、225.用队列实现栈]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136217745</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136217745</guid><author>evelynancyyy</author><pubDate>Thu, 22 Feb 2024 12:22:43 +0800</pubDate><description><![CDATA[/栈空间//栈顶指针。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第8天|344.反转字符串、541. 反转字符串II、卡码网：54.替换数字、151.翻转字符串里的单词、卡码网：55.右旋转字符串]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136192251</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136192251</guid><author>evelynancyyy</author><pubDate>Wed, 21 Feb 2024 17:30:58 +0800</pubDate><description><![CDATA[但是一开始只申请了指针，没有申请空间，于是报错（笑丝）。暴力解法，从后往前遍历字符串，每遍历到一个单词则记录下单词的上下边界，复制到returnStr中，并加上空格。（否则a变的时候b也变了，会在第二条语句处得到0^0=0，最后两个值全为0了！双指针：前指针向后，后指针向前，直到二者相遇，在过程中将两指针指向的元素swap。承接上题，有思路，但是被各种下标绕晕了……在本题中，如果写成：（注意while循环条件带了等于号！如果当前字符是空格，并且下一个字符也是空格，则跳过。思路清晰，前后双指针，成功ac。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第5天|哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和]]></title><link>https://blog.youkuaiyun.com/evelynancyyy/article/details/136143110</link><guid>https://blog.youkuaiyun.com/evelynancyyy/article/details/136143110</guid><author>evelynancyyy</author><pubDate>Sat, 17 Feb 2024 23:18:12 +0800</pubDate><description><![CDATA[①什么时候想到用哈希法？当我们遇到了（如果在做面试题目的时候遇到需要也应该第一时间想到哈希法）②哈希表：散列表，hash table，根据关键码的值而直接进行访问的数据结构。③哈希函数：hash function，关键码的值到表中元素的映射关系。④tableSize：哈希表大小；dataSize：实际存放哈希表的数组大小⑤空间换时间。]]></description><category></category></item></channel></rss>