<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[vvanss的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/vvanss</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; vvanss]]></copyright><item><title><![CDATA[LeetCode 第三十三天 2024.8.19]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141339505</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141339505</guid><author>vvanss</author><pubDate>Tue, 20 Aug 2024 12:21:04 +0800</pubDate><description><![CDATA[确定递推公式:  dp[i][0] = dp[i-1][0], dp[i][1] = max(dp[i-1][0]-prices[i],dp[i-1][1]),dp[i][2] = max(dp[i-1][1]+prices[i],dp[i-1][2]),dp[i][3] = max(dp[i-1][2]-prices[i],dp[i-1][3]),dp[i][4] = max(dp[i-1][3]+prices[i],dp[i-1][4])或者是前一天就是卖出股票状态，一直没操作）]]></description><category></category></item><item><title><![CDATA[LeetCode 第三十一天 2024.8.18]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141319779</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141319779</guid><author>vvanss</author><pubDate>Mon, 19 Aug 2024 11:55:42 +0800</pubDate><description><![CDATA[确定递推公式:  if price[i] > price[i-1]: dp[i] =dp[i-1]+(price[i] - price[i-1]) else:dp[i] = dp[i-1]# 同样dp[i][1]取最大的，dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);# 那么dp[i][0]应该选所得现金最大的，所以dp[i][0] = max(dp[i - 1][0], -prices[i]);]]></description><category></category></item><item><title><![CDATA[LeetCode 第三十一天 2024.8.17]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141291659</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141291659</guid><author>vvanss</author><pubDate>Sun, 18 Aug 2024 10:05:19 +0800</pubDate><description><![CDATA[偷当前节点就不能偷左右孩子，所以dp[val1] = 当前节点的值+不偷左孩子的最大值即左孩子的dp[val1]+不偷右孩子的最大值即右孩子的dp[val1]# 确定递推公式: dp[i] =  max(dp[i-2]+nums[i],dp[i-1])# 确定递推公式: dp[i] =  max(dp[i-2]+nums[i],dp[i-1])# dp数组如何初始化:  dp[0]=0 dp[1] = nums[0]# dp数组如何初始化:  dp[0]=0 dp[1] = nums[0]]]></description><category></category></item><item><title><![CDATA[LeetCode 第三十天2024.8.15]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141271923</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141271923</guid><author>vvanss</author><pubDate>Sun, 18 Aug 2024 08:21:54 +0800</pubDate><description><![CDATA[确定遍历顺序: 这道题只能先背包再物品，因为物品有顺序，例如"apple" "pen" "apple"和"apple" "apple" "pen" 不一样 所以，j从0到len(s) i从0到j。# 确定递推公式: i从0到j 如果存在dp[i]是true以及dp[j-i]是true那么dp[j]也是true。# 确定递推公式: dp[j] min(dp[j-coins[i]]+1,dp[j])# 确定递推公式: dp[j] min(dp[j-nums[i]]+1,dp[j])]]></description><category></category></item><item><title><![CDATA[LeetCode 第二十九天 2024.8.15]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141232737</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141232737</guid><author>vvanss</author><pubDate>Fri, 16 Aug 2024 11:38:45 +0800</pubDate><description><![CDATA[1049. 最后一块石头的重量 II - 力扣（LeetCode）]]></description><category></category></item><item><title><![CDATA[LeetCode 第二十八天 2024.8.14]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141204340</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141204340</guid><author>vvanss</author><pubDate>Thu, 15 Aug 2024 21:58:11 +0800</pubDate><description><![CDATA[确定递推公式: 就看这个物品(重量weight[i])放不放进背包里，放不进去直接dp[i][j] = dp[i-1][j] 能放进去看放进去价值大还是不放进去价值大dp[i][j] = max( dp[i-1][j], dp[i-1][j-weight[i]] +value[i])# dp数组如何初始化:  dp[0][i] = 1 dp[i][0] = 1,在有障碍物的地方都是0，并且dp[0][i]和dp[i][0]在i==0后面所有都是0。# 确定遍历顺序: 先遍历物品，然后遍历背包重量。]]></description><category></category></item><item><title><![CDATA[LeetCode 第二十六天 2024.8.13]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141178513</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141178513</guid><author>vvanss</author><pubDate>Wed, 14 Aug 2024 07:10:29 +0800</pubDate><description><![CDATA[确定递推公式: dp[n] = min(dp[n-1]+cost[n-1],dp[n-2]+cost[n-2])注意数组初始化是dp[0]=0 dp[1]=0，不是dp[0]=cost[0] dp[1]=[1]# 确定递推公式: dp[i][j] = dp[i-1][j] + dp[i][j-1]# 举例推导dp数组: dp[3][7] = dp[2][7] + dp[3][6]# dp数组如何初始化:  dp[0][i] = 1 dp[i][0] = 1。]]></description><category></category></item><item><title><![CDATA[LeetCode 第二十五天 2024.8.12]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141147163</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141147163</guid><author>vvanss</author><pubDate>Tue, 13 Aug 2024 10:30:47 +0800</pubDate><description><![CDATA[所以在每次for循环前面设立一个set，for循环里判断现在取的这个数在不在set里，在就不取了。这样就避免了重复问题。这道题的目的是要找到数组的全排列，所以我们不能有startindex这个参数，但如果像上一道题那样对层去重会解决不了对树杈（树的深度）去重的问题，例如会出现[1,1,1]这样的情况，所以我们要对列去重，可以直接在方法中再传入一个参数，这个参数显示应该对哪个元素再列上去重，再遍历完这一列后，再恢复元素。这道题又要对层去重，又要对树杈去重，综合了前两道题的去重方法，就可以做出来了。]]></description><category></category></item><item><title><![CDATA[LeetCode 第二十四天 2024.8.10]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141100484</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141100484</guid><author>vvanss</author><pubDate>Sun, 11 Aug 2024 08:05:45 +0800</pubDate><description><![CDATA[看到这道题不要被难住，没有思路是正常的，这道题的难点也是在于怎么去判断递归的终止条件，由于是四段，我们可以用startindex == len（s）和len(path) == 4来判断，同时要验证每次加的字符串是不是合规，我们也要另写一个isvaild函数判断字符串合规状态，别的就不用管了，一直递归就完事了。然而，在这个生成子集的场景中，递归调用不需要提前终止，因此 return 是不必要的。如果你不加 return，继续递归： 不加 return 时，递归调用会继续执行后面的循环和回溯操作。]]></description><category></category></item><item><title><![CDATA[LeetCode 第二十三天 2024.8.9]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141073706</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141073706</guid><author>vvanss</author><pubDate>Sun, 11 Aug 2024 05:02:34 +0800</pubDate><description><![CDATA[所以可以先对数组进行排列，然后在对i的for循环中，判断在i>startindex的情况下nums[i] == nums[i-1]的情况，如果满足条件就continue，注意在这里，一定是i>startindex，不能i>0,因为如果i> 0就把枝中的也去掉了。这道题相比之前简单的组合问题，难点在于可以重复选择，重复选择也是需要startindex的，因为如果没有startindex在递归中将会一直在第一个陷入死循环。这道题的难点在于能否想到递归终止条件是startindex == len(s),]]></description><category></category></item><item><title><![CDATA[LeetCode 第二十二天 2024.8.8]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141052315</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141052315</guid><author>vvanss</author><pubDate>Fri, 09 Aug 2024 12:05:33 +0800</pubDate><description><![CDATA[所以删除要考虑的情况多一些，尤其是当遍历到当前的结点的值和要寻找的key值相同且当前节点左右孩子都不是none的时候，我们要先找到当前节点右子树的最左边的节点，再把当前节点的左子树放到右子树的最左边的节点的左节点。说实话看起来很绕，但最关键的就是要找的当前节点右子树的最左边的节点。从题目中看懂树是从右下角开始遍历的，像原先的题一样有一个pre节点，一个一个右中左遍历即可。当前节点的值变成当前节点 的值加上pre的值。每次去最中间的元素然后一直遍历，有返回值当作前一个遍历节点的left和right。]]></description><category></category></item><item><title><![CDATA[Leetcode 第二十一天 2024.8.7]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/141020402</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/141020402</guid><author>vvanss</author><pubDate>Thu, 08 Aug 2024 11:08:33 +0800</pubDate><description><![CDATA[这道题可以直接用二叉树最近公共祖先实现，但也可以利用二叉搜索数自己的特性，去从上往下遍历，找到的第一个在p，q节点值中间的节点，即为p，q的最近公共祖先。递归二叉搜索数，遇到空节点且数值合适的位置放进去。思路一，当成普通二叉树从下往上遍历。]]></description><category></category></item><item><title><![CDATA[Leetcode 第二十天 2024.8.6]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/140970711</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/140970711</guid><author>vvanss</author><pubDate>Wed, 07 Aug 2024 08:48:55 +0800</pubDate><description><![CDATA[又忘了怎么对字典的value排序，根据字典中的value对key进行排序用sortdic = sorted(findic.items(), key= lambda item:item[1],reverse = True)，注意其中的key= lambda item:item[1]不能省略，省略会自动按照key进行排序。本题要想到是从底部往顶部遍历二叉树，要对二叉树底层判断是不是存在p，q，然后如果存在则返回他们的公共祖先，从底部往顶部遍历的情况优先考虑后序遍历。]]></description><category></category></item><item><title><![CDATA[LeetCode 第十九天 204.8.6]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/140943535</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/140943535</guid><author>vvanss</author><pubDate>Tue, 06 Aug 2024 10:15:07 +0800</pubDate><description><![CDATA[另外定义pre要写self.pre = None而不能写self.pre = TreeNode()，self.pre = TreeNode()默认pre的值为0，在root=[0]或更小的情况下就无法完成递归，返回错误结果。根节点的左子树的所有节点都要比根节点小，同理，右子树的所有节点都要比根节点大，有时候，右边也是二叉搜索数，但由于右子树根节点的孩子比右子树的上层根节点小，会出现错误！二叉搜索数是有序的，左节点的值< 根节点的值<右节点的值，所以遍历的时候可以进行判断。]]></description><category></category></item><item><title><![CDATA[leetcode 第十八天 2024.8.2]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/140882869</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/140882869</guid><author>vvanss</author><pubDate>Tue, 06 Aug 2024 07:22:38 +0800</pubDate><description><![CDATA[要知道两个顺序构造一个唯一的二叉树的思路，后序数组的最后一个元素为切割点，先切中序数组，根据中序数组，反过来再切后序数组。还有需要注意的是，一定要先切割中序数组，再根据切割后中序数组的长度去切割后序数组。这道题和寻找二叉树路径很像，只不过没有了现成的节点和数，但我们可以抽象出一个数出来帮助我们理顺递归和回溯的逻辑。对于这道题，在回溯算法的参数中没有考虑到加入starinx来代表遍历开始的节点。本题的如果用到剪枝，注意回溯的时候也要把cursumm - i，和上一道题一样的思路，甚至略简单。]]></description><category></category></item><item><title><![CDATA[leetcode 第十七天 2024.8.1]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/140861589</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/140861589</guid><author>vvanss</author><pubDate>Fri, 02 Aug 2024 23:17:06 +0800</pubDate><description><![CDATA[本题和前面的所有路径很像一下就想到了，但是非常重要的一点就是在递归方法中不能直接res.append(path)。所以需要用path【：】创建一个path副本进行储存，这样后面path的回溯操作就不会影响到res里的结果。本题难点在于如果想找左叶子节点，不能从当前节点本身判断，而是要根据他的父节点怕判断这个节点是不是左叶子节点，判断条件为cur.left!由于判断条件过长而不敢往下写。]]></description><category></category></item><item><title><![CDATA[leetcode 第十六天 2024.8.1]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/140837174</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/140837174</guid><author>vvanss</author><pubDate>Thu, 01 Aug 2024 10:07:08 +0800</pubDate><description><![CDATA[如果提前+1的话，会导致原先不平衡的节点本身是-1但再+1后变成0导致这个节点的不平衡判断不出来。迭代法相对于递归对思维的要求没那么高，迭代法的难点在于，在循环开始之前我们需要一个pathstr来记录我们每个节点所对应的路径，再一个节点一个节点的遍历下去的时候，我们需要有一个path（pathstr的最后一项对应cur是取自que的最后一项，cur和path是一一对应的）path再把cur这个节点更新到path上，当遇到叶子节点的时候，将记录的当前path加入到res里。还是不能熟练写出递归法。]]></description><category></category></item><item><title><![CDATA[leetcode 第十五天 2024.4.30]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/136695632</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/136695632</guid><author>vvanss</author><pubDate>Wed, 01 May 2024 12:47:45 +0800</pubDate><description><![CDATA[所以我们不能用层序遍历，这道题的破题思路为判断一个节点的左右子树是否对称，要想到递归的思路，定义一个方法判断一个节点的左右子树是否对称，每次有数种情况，对每种情况分别进行判断以及返回值，注意：每次判断我们需要外侧和外侧判断，内测和内测判断，因此在向下递归的过程中给需要判断左节点的左子树和右节点的右子树，以及左节点的右子树和右节点的左子树。不要被这个题目吓到，拿到二叉树的题目先考虑应该如何去遍历这个二叉树，这道题直接用前序遍历加递归就可以做出来。想到用后续遍历但不会写，对递归的条件判断不清楚。]]></description><category></category></item><item><title><![CDATA[leetcode 第十四天 2024.3.27]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/137093612</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/137093612</guid><author>vvanss</author><pubDate>Sat, 30 Mar 2024 06:42:26 +0800</pubDate><description><![CDATA[将遍历到的代码放入队列中，并记录此层所有的节点个数为size，然后一个一个弹出，弹出的同时将这个节点的左右子节点都加入到队列中，弹出一个节点size减一，直到size为0，这时这一层的所有节点都已经弹出，然后我们重新获取size，此时的size就是下一层的所有节点个数。和上一道题基本思路一致，不用把每个节点都加入结果数组中，只需要判断当前节点是不是本层中最后一个节点，是最后一个节点将其加入到返回数组，不是则跳过。在将节点的左右子节点放入队列时忘记判断当前节点左右子节点是否存在。]]></description><category></category></item><item><title><![CDATA[leetcode 第十三天 2024.3.26]]></title><link>https://blog.youkuaiyun.com/vvanss/article/details/137058809</link><guid>https://blog.youkuaiyun.com/vvanss/article/details/137058809</guid><author>vvanss</author><pubDate>Wed, 27 Mar 2024 00:18:01 +0800</pubDate><description><![CDATA[3.确定单层递归的逻辑。基本的思路是我们创建一个栈stack，然后往里放数据，再弹出，对于前序遍历，我们把根节点放进stack后把它弹出，然后关键就来了，如何往下进行，因为是前序我们最后的顺序需要是中左右，所以我们再弹出根节点后需要把右子节点压入stack中，然后再把左子节点压入栈中，下一次pop出来的就是我们上一个根节点的左子节点，然后对这个左子节点的右子节点压入栈中再压入这个左子节点的左子节点，周而复始。这里的前中后序指的是中这个节点的位置，前就在左右前面，后就在左右后面，放在左右对应的位置上.]]></description><category></category></item></channel></rss>