<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[veatheroe的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/veatheroe</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; veatheroe]]></copyright><item><title><![CDATA[Leetcode 3290. 最高乘法得分]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/142307544</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/142307544</guid><author>veatheroe</author><pubDate>Mon, 16 Sep 2024 21:43:13 +0800</pubDate><description><![CDATA[【代码】Leetcode 3290. 最高乘法得分。]]></description><category></category></item><item><title><![CDATA[LeetCode 3186 最大施法伤害]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/139755396</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/139755396</guid><author>veatheroe</author><pubDate>Mon, 17 Jun 2024 22:03:41 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）这道题很直观，玩游戏的都懂，伤害最大化嘛！但是每个法术释放与否可能会影响总体的伤害，因此是从局部最优解找到全局最优解的动态规划问题！禁止释法的区间是+-2，且相同伤害的法术可以释放多次，所以很容易想到，将伤害相同的法术进行计数，并按照伤害的大小进行排序。这样就可以从最小的伤害开始考虑释放与否了。剩下的，直接看代码吧]]></description><category></category></item><item><title><![CDATA[LeetCode 310 最小高度树]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/139754943</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/139754943</guid><author>veatheroe</author><pubDate>Mon, 17 Jun 2024 21:41:28 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）可以通过归纳法证明出一棵树的最小高度树可以通过从最外面度为1的叶子节点一层一层向内遍历得到，可以使用一种称为 **中心缩减法**（或称为 **剥洋葱法**）的方法。我们将逐步解释这个方法，并证明其正确性。### 定义和问题陈述
- **树**：无环连通图。
- **树的高度**：从根节点到任意叶子节点的最长路径。
- **最小高度树**：使树的高度最小的树。对于给定的无向树，可能存在多个根节点，使得树的高度最小。### 中心缩减法（剥洋葱法）这个方法]]></description><category></category></item><item><title><![CDATA[Leetcode 410 分割数组]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/138010592</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/138010592</guid><author>veatheroe</author><pubDate>Sat, 20 Apr 2024 21:01:26 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）将一个数组切k刀，每一块子数组求和，共k+1个数，这里面有一个最大的数Max。找一种切法，使这个Max最小。暴力解法一定是会超时的，因为包含了大量的重复计算。如果我们能够保存且借助已经算过的结果，在此基础上在更大范围的数组上计算，势必能节省更多的计算时间。这是动态规划的思路。由于Max的取值上下限已知，上限是所有数的和，下限是最小的元素，如果我们能找到一种快速逼近结果的方法，也能够很快计算出结果，这是二分的思路。试想一下，在长度为[0,l]的数组上切]]></description><category></category></item><item><title><![CDATA[Leetcode 528 按权重随机选择]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/137751291</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/137751291</guid><author>veatheroe</author><pubDate>Sun, 14 Apr 2024 22:27:37 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）想象题目提供的w数组里是很多根长短不一的棍子，然后我们将其按顺序排列成一条线。然后我们扔一个沙包，砸中哪一根棍子，就代表命中了那根棍子代表的数字。很显然，棍子越长，就越容易砸中。假如这五根棍子分别长1，2，3，4，5，那么合并后总长度就是1+2+3+4+5=15那么沙包扔出后可能会落在0到15之间的任何一个位置。具体来说，落到[0,1]的可能性会比落到[1,3]小，因为后者代表的区间更大，而概率最大的则是[10,15],这代表了最后一根棍子的区间。那]]></description><category></category></item><item><title><![CDATA[LeetCode 1438 绝对差不超过限制的最长连续子数组]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/137480111</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/137480111</guid><author>veatheroe</author><pubDate>Sun, 07 Apr 2024 23:01:46 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）这是一道非常好的题目，同时考察了TreeMap, 单调队列，滑动窗口。题意就是求连续子数组中最大最小元素差值绝对值不大于k的最长长度。最直观的写法就是维护一个滑动窗口，并对窗口内的元素进行排序，这样就可以随时知道窗口内的最大绝对差。给定长度为n的nums 数组，对于任意的左右下标l 和r, 0<=l<r<=n-1 当最大绝对差大于k时，我们便将窗口右移，并更新窗口内的元素。我们记录滑动过程中的最大长度，直到滑倒最右端。以下面数组为例
nums = []]></description><category></category></item><item><title><![CDATA[LeetCode 378 有序矩阵中第K小的元素]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/137432123</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/137432123</guid><author>veatheroe</author><pubDate>Sat, 06 Apr 2024 18:08:49 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）题解内容大量转载于：. - 力扣（LeetCode）题意很直观，就是求二维矩阵中所有元素排序后第k小的数。该写法不再赘述，维护一个大小为k的小顶堆，遍历矩阵所有元素进行入堆操作。时间复杂度:O(nlogk)空间复杂度:O(k)


二分写法

由于矩阵在行和列上都是有序的，因此左上角的元素matrix[0][0]一定是最小的，右下角的元素matrix[n-1][n-1]一定是最大的。这两个元素，我们分别记为l 和 r.以下图为例:可以发现， 任取一个]]></description><category></category></item><item><title><![CDATA[LeetCode 264 丑数II]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/137423118</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/137423118</guid><author>veatheroe</author><pubDate>Sat, 06 Apr 2024 11:06:34 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）所谓丑数就是满足: (2^x)*(3^y)*(5^z), 其中,x,y,z >= 0的数。题目要求的是求严格递增的第n个丑数。可以维护一个小顶堆，每一次拿出堆顶元素，然后分别乘以2，3，5再都扔回堆里，依次进行操作，直到第n个元素。在实现时，要注意对重复元素的处理。时间复杂度:(nlogn),堆的每次出入操作需要花费logn, 共需要n次这样的操作。额外空间复杂度: (n)， 我们需要维护一个最大长度为n的堆。


动态规划写法

第k个丑数一定是它]]></description><category></category></item><item><title><![CDATA[LeetCode 973 最接近原点的K个点]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/137384126</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/137384126</guid><author>veatheroe</author><pubDate>Thu, 04 Apr 2024 22:26:37 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）题意简单且直观，而且是很经典的考验快速排序以及堆排序的算法题，很考验基本功。对points数组原地建立小顶堆并依次弹出第1个元素，重新调整堆顶元素，再弹出第1个。。。直到弹出前K个元素。时间复杂度: O(nlogn)额外空间复杂度:O(k)


快速排序写法

普通的写法是直接对整个数组排序，然后取前k个元素，然而这不是最高效的。由于我们仅需要前k个元素，而且不关注顺序，因此可以省略到k之后元素的顺序。假如我们当前左右边界分别是l和r,在快排中间步骤]]></description><category></category></item><item><title><![CDATA[Leetcode 73 矩阵置零]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/137247976</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/137247976</guid><author>veatheroe</author><pubDate>Mon, 01 Apr 2024 22:02:32 +0800</pubDate><description><![CDATA[LeetCode地址: . - 力扣（LeetCode）矩阵是m*n的，如果某个元素(i,j)等于0，则将第i行和第j列的所有元素都置零。既然如此，我们可以便利每一个元素，并记录下哪一行哪一列有零。记录完毕后，重新遍历整个矩阵，如果其所在行或者所在列存在零，则置为零。所以问题变成了，在哪里保存这些信息: 哪一行哪一列有零我们可以通过一个m长和n长的数组来保存这些信息，这会产生O(m+n)的额外空间复杂度。我们也可以把这些信息直接保存在矩阵的第一列和第一行！代价是我们要提前遍历第一行和第一列，检查其是否存在零]]></description><category></category></item><item><title><![CDATA[Leetcode 128 最长连续序列]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/137245416</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/137245416</guid><author>veatheroe</author><pubDate>Mon, 01 Apr 2024 20:43:58 +0800</pubDate><description><![CDATA[LeetCode地址: . - 力扣（LeetCode）题目要求O(n)的时间复杂度，也就不能使用排序或者暴力枚举的方法解题。暴力枚举的缺陷在于重复计算。我们通过以下数列来说明存在哪些重复计算： 4，3，2，1。第一个数是4， 4+1=5， 5不存在，累加结束；最大连续长度是1第二个数是3，3+1=4，4存在；4+1=5， 5不存在，累加结束；最大连续长度是2第三个数是2， 2+1=3，3+1=4，4+1=5， 5不存在，累加结束；最大连续长度是3第四个数是1，1+1=2，2+1=3，3+1=4，4+1=5]]></description><category></category></item><item><title><![CDATA[Leetcode 239 滑动窗口最大值]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/136759725</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/136759725</guid><author>veatheroe</author><pubDate>Sat, 16 Mar 2024 12:31:13 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）题意是很好理解的，一个固定长度(k)的滑块从一个数组的左端一步一步向右滑，然后挑出滑块盖住的那些数字中最大的，组成的数组就是结果。难点在于，当滑块移动时，左端的数字会被遗弃，如果遗弃的刚好是最大的数字，则要从剩下的k-1个元素以及右端新覆盖的元素里找到最大的。想要让时间复杂度低，需要找到一种低成本的方式维护这些数字的有序性。这样，即便最大的元素遗弃了，第二大的元素也唾手可得。如何得到一个单调递减的元素列 array呢？假设当前滑块的左下标是l，右下标]]></description><category></category></item><item><title><![CDATA[Leetcode.901 股票价格跨度]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/136330146</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/136330146</guid><author>veatheroe</author><pubDate>Tue, 27 Feb 2024 20:00:53 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）价格跨度的定义在题目中很明确，就是韭菜持有一只股票且该股票保持连续上涨最大的天数。直观的想，我们可以保存第一天到当前天的所有股价，并一天一天往前找单调递减的连续天数。但是考虑这样一个股价序列, 1,2,3,4,5,6,7,在计算6和7的股价跨度时，会存在大量的重复计算。因为计算7的跨度时候，需要遍历到1，计算6的跨度时，也需要遍历到1。让我们换一个思路。假如后一天的股价比前一天小，则显然它的跨度就是1，此时我们需要将该天的股价和跨度缓存起来，因为后一]]></description><category></category></item><item><title><![CDATA[Leetcode. 739 每日温度]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/136274481</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/136274481</guid><author>veatheroe</author><pubDate>Sat, 24 Feb 2024 19:04:37 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）题意很好理解，找到比每日温度更高的温度的已过天数的偏移量。如果找不到，则设为0。最直观的想法是，从每一天开始向后一天一天找，直到找到更高温度的那一天。但是这种做法时间复杂度过高，有太多重复的操作，因此需要找更优的算法。容易发现，当遍历到第i天，温度为25度的前提下，如果第i+1天的温度比25度高，则第i天的结果很好计算，即是1. 如果第i+1天的温度没超过2度，则暂时得不到结果，那不如先将第i+1天的温度暂存起来，继续看第i+2天，如果温度继续走低，]]></description><category></category></item><item><title><![CDATA[Leetcode 85. 最大矩形]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/136008506</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/136008506</guid><author>veatheroe</author><pubDate>Sat, 03 Feb 2024 16:33:29 +0800</pubDate><description><![CDATA[LeetoCode地址: 力扣（LeetCode）官网 - 全球极客挚爱的技术成长平台该题是84题的升级版。84题给出了一个一维数组，即一行数据，每个元素是高度。而该题则是给出了二维数组，只需我们将每一行的高度自行求出，即可以运用相同的算法解决。该题目的难点在于思维模型上，如何借助单调栈和数组给出的信息进行快速求解。以示例1为例：如果将每一行的1的高度(即连续的1的长度)以橙色标注出来，会发现只包含1的最大矩形出现在第三行里，2*3=6.不难发现，每一个矩形都是由一列一列1组成的，我们要找到的就是能够组成最]]></description><category></category></item><item><title><![CDATA[Leetcode. 212 单词搜索II]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/135889479</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/135889479</guid><author>veatheroe</author><pubDate>Sun, 28 Jan 2024 21:35:09 +0800</pubDate><description><![CDATA[LeetoCode地址: 力扣（LeetCode）官网 - 全球极客挚爱的技术成长平台该题目也是匹配字符串，但是高级一点。首先，要找到的字符串不再是单一一个，而是一个列表words，最大有3 *10^4个。其次，我们要在一个二维字符网格board上找寻，不再是若干个单词，即一个一维的字符数组。有点像需要棋盘上从任何一个位置开始走出一条蛇形路径，该路径刚好匹配字符串word。而每一步该怎么走呢？有四个方向，当然就有四个走法，到下一个位置后，同样有四种走法。那终止条件是什么？撞墙或者是四个方向的位置都已经用过了]]></description><category></category></item><item><title><![CDATA[Leetcode 1268 搜索推荐系统]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/135796955</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/135796955</guid><author>veatheroe</author><pubDate>Sat, 27 Jan 2024 11:01:07 +0800</pubDate><description><![CDATA[LeetoCode地址: 力扣（LeetCode）官网 - 全球极客挚爱的技术成长平台这道题的题意不难理解，在我们使用搜索引擎的每一天都会遇到，不需要输入完整的关键词，哪怕仅仅只输入一个字，搜索引擎就会自动返回若干以这个字开头的若干查询结果，比如最近爆火的《繁花》电视剧该题目是搜索引擎的极致简化版，每个字符都是a-z这26个小写字母。如果你做过Trie 树相关的题目，很容就能联想到该题目可以以同样的方式求解，当我们建立好Trie 树之后，只要按照searchWord的每个字符进行逐个匹配直到最后一个字符，这]]></description><category></category></item><item><title><![CDATA[LeetCode 211.添加与搜索单词 - 数据结构设计 题解]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/135727059</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/135727059</guid><author>veatheroe</author><pubDate>Sun, 21 Jan 2024 12:10:16 +0800</pubDate><description><![CDATA[LeetoCode地址: 力扣（LeetCode）官网 - 全球极客挚爱的技术成长平台该题是LeetCode 208.实现Trie(前缀树) 题解  的进阶与变体。本质还是通过Trie树插入与查找字符串。但是该题引入了一个新字符 '.'， 它可以替代任何a到z这个26个小写字母。所在在遍历过程中，不再是一条单一的路径，而是应该沿着树的所有可能分枝进行深入，想起什么了没？没错！就是树的深度遍历。在进行DFS深度优先遍历时，我们并不需要枚举所有的可能性，毕竟题目仅仅只是需要确定是否存在某字符串，而不是找出所有的]]></description><category></category></item><item><title><![CDATA[LeetCode 208.实现Trie(前缀树) 题解]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/135574217</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/135574217</guid><author>veatheroe</author><pubDate>Sat, 13 Jan 2024 21:15:18 +0800</pubDate><description><![CDATA[LeetoCode地址: . - 力扣（LeetCode）题目已经清晰的告诉了我们要实现Trie，以及它的优点，那么这些优点解决了什么问题，为什么传统的方法不行？现在让我们还原一下问题: 保存一些字符串，并判定新给出的字符串是否是这些字符串中的一员，或者是其中某一员的前缀。举个例子，保存"app", "apple", "application"这三个字符串,并判断"app", "append"是否是这些字符串组成的集合里的元素，判断"app", "appl" "appc" 是否是这些字符串组成集合的某个元素]]></description><category></category></item><item><title><![CDATA[LeetCode 547.省份数量 题解]]></title><link>https://blog.youkuaiyun.com/veatheroe/article/details/135416861</link><guid>https://blog.youkuaiyun.com/veatheroe/article/details/135416861</guid><author>veatheroe</author><pubDate>Sat, 06 Jan 2024 13:18:59 +0800</pubDate><description><![CDATA[如果我们能从isConnected的第一个子数组开始遍历，每遍历到一个城市的编号，就再深入一层去遍历该编号对应于isConnected中的那个子数组，递归的操作，并记录下所有已经遇到的城市编号，递归的终止条件就是已经该城市已经遇到且处理过了。时间复杂度：O(n^2), 最复杂的操作是递归找城市的过程，深度为城市的个数n,每次递归要循环的子数组大小为城市个数n,相乘得到n^2.同时，题目的输入是一个数组，数组长度是城市个数，每个元素都是一个数组，代表了这个城市和其他哪些城市相连。，这里就不重复赘述了。]]></description><category></category></item></channel></rss>