<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Yinems的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Yinems</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Yinems]]></copyright><item><title><![CDATA[代码随想录算法训练营第62天|Floyd 算法精讲、A * 算法精讲 （A star算法）]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141634709</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141634709</guid><author>Yinems</author><pubDate>Wed, 28 Aug 2024 16:48:44 +0800</pubDate><description><![CDATA[分两种情况，一种是节点 i 到节点 j 的最短路径经过节点 k，grid[i][j][k] = grid[i][k][k-1] + grid[k][j][k-1]；另一种情况，节点 i 到节点 j 的最短路径不经过节点 k，grid[i][j][k] = grip[i][j][k-1]；刚开始初始化 k 是不确定的，如果赋值为1，那么不能知道节点 i 到节点 j 经过1个节点的最短距离，所以只能把 k 赋值为0，本题中节点0是无意义的，节点是从1到n。本题求的是最小值，所以其余值初始化为最大值。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第61天|Bellman_ford 队列优化算法（又名SPFA）、bellman_ford之判断负权回路、bellman_ford之单源有限最短路]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141564442</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141564442</guid><author>Yinems</author><pubDate>Wed, 28 Aug 2024 10:35:13 +0800</pubDate><description><![CDATA[这道题和上一题的区别在于存在负权环路，在bellman_ford算法中，对于minDist数组，松弛n-1次所有边就可以得到起点到其他节点的最短距离，松弛n次以上，数组中的结果也不会改变。在对所有边进行松弛的过程中，有可能因为边的顺序导致所有节点都更新，这就可能违背至多经过k个节点的限制。Bellman_ford算法每次都对所有边进行松弛，但其实真正有效的松弛，是基于已经计算过的节点在做的松弛。在加入队列的过程可以有一个优化，用visited数组记录已经在队列里的元素，已经在队列的元素不用重复加入。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第60天|dijkstra（堆优化版）精讲、Bellman_ford 算法精讲]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141531296</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141531296</guid><author>Yinems</author><pubDate>Mon, 26 Aug 2024 15:00:40 +0800</pubDate><description><![CDATA[Bellman_ford算法的核心是对所有边进行松弛n-1次操作，n是节点数量，从而求得目标最短路。以此类推，节点数量为n，起点到终点最多有n-1条边，因此需要松弛n-1次。当从边的角度 出发，在处理第一步的时候就不需要遍历所有节点，而且直接把边加入到小顶堆中，那么每次从堆顶中取到的边自然就是距离源点最近的节点所在的边。，grid数组是用来存图的，是题目描述中必须要使用的空间，而不是算法使用的空间，因此只算minDist数组的空间。，建立邻接表，数组空间为N，有多少条边就对应多少的链表节点。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第58天|拓扑排序精讲、dijkstra（朴素版）精讲]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141501553</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141501553</guid><author>Yinems</author><pubDate>Sun, 25 Aug 2024 16:50:00 +0800</pubDate><description><![CDATA[拓扑排序要检测这个有向图是否有环，即存在循环依赖的情况，因为这种情况是不能做线性排序的。拓扑排序的过程，有两步，第一步，找到入度为0的节点，加入结果集；第二步，将该节点从图中移除。结果集的顺序，就是想要的拓扑排序顺序。这道题是求最短路，最短路是图论中的经典问题，给出一个有向图，一个起点，一个终点，问起点到终点的最短路径。在dijkstra算法中，同样有一个数组很重要，起名为：minDist。prim算法是求非访问节点到最小生成树的最小距离，而dijkstra算法是求非访问节点到源点的最小距离。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第57天|prim算法精讲、kruskal算法精讲]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141470680</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141470680</guid><author>Yinems</author><pubDate>Sat, 24 Aug 2024 16:38:31 +0800</pubDate><description><![CDATA[最小生成树是所有节点的最小连通子图，以最小的成本将图中所有节点连接到一起。prim算法是从节点的角度，采用贪心的策略，每次寻找距离 最小生成树最近的节点 并加入到最小生成树中。minDist数组用来记录每一个节点距离最小生成树的最近距离，也就是最小生成树的边的权值。kruskal是维护边的集合，其思路为，边的权值排序，因为要优先选最小的边加入到生成树中；遍历排序后的边，如果边首尾的两个节点在同一个集合，说明如果连上这条边图会出现环，如果不在同一个集合里，加入最小生成树，并把两个节点加入同一集合。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第56天|108. 冗余连接、109. 冗余连接II]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141462611</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141462611</guid><author>Yinems</author><pubDate>Fri, 23 Aug 2024 17:13:43 +0800</pubDate><description><![CDATA[本题的本质是，有一个有向图，是由一颗有向树+一条有向边组成的。有向树的性质，只有根节点入度为0，其他节点入度为1，因为该树除了根节点外的每个节点都有且只有一个父节点，而根节点没有父节点。有三种情况，第一种情况，找到入度为2的点，删哪条都一样，那么删掉一条指向该节点的边就行了。第三种情况，如果没有入度为2的点，说明图中有环，删除构成环的边就可以了。从前往后遍历每一条边，判断边的两个节点是否在同一个集合，如果不在，则将它们加入集合，如果在，说明这两个点已经连在一起了，则这条边冗余。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第55天|并查集理论基础、107. 寻找存在的路径]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141433955</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141433955</guid><author>Yinems</author><pubDate>Fri, 23 Aug 2024 11:43:23 +0800</pubDate><description><![CDATA[并查集主要有两个功能：将两个元素添加到一个集合中，判断两个元素是否在同一个集合中。之间，且随着查询或者合并操作的增加，会越来越趋于。，路径压缩后的并查集时间复杂度在。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第54天|110. 字符串接龙、105.有向图的完全可达性、106. 岛屿的周长]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141400196</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141400196</guid><author>Yinems</author><pubDate>Thu, 22 Aug 2024 17:37:05 +0800</pubDate><description><![CDATA[同时，本题是个无向图，需要标记节点是否被访问过，不然会陷入死循环，使用集合来检查字符串是否出现在字符串集合中更快一点。用矩阵记录访问过的节点，深搜一遍之后，如果所有节点都被访问过，则输出1。本题是有向图搜索全路径的问题，dfs有两种写法，一种是处理当前访问的节点，如果是访问过的节点则终止本层递归；当走不通时，周长加一。走不通有两种情况，一种是之前访问过，另一种是遇到水域，因此具体为当遇到水域的时候周长加一。有两种解法，一种是遍历每格，遇到岛屿就计算其上下左右的空格情况，如果遇到水域和出界则说明是一条边。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第53天|101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104.建造最大岛屿]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141362427</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141362427</guid><author>Yinems</author><pubDate>Wed, 21 Aug 2024 18:14:48 +0800</pubDate><description><![CDATA[思路：从地图周边出发，将周边空格相邻的陆地都做上标记，然后遍历一遍地图，遇到陆地且没有做过标记的，那么就是地图中间的陆地，全部改成水域就行。步骤一：将地图周边的陆地1全部改为特殊标记2；步骤二：将中间的陆地1全部改为水域0；第二步，再遍历一遍地图，遍历0，统计其由0变1周边的岛屿面积，将其相邻面积加在一起。调用递归函数时，visited列表会记录节点是否被访问过，因此每个节点只会访问一边，所有算法的时间复杂度为。将周边靠陆地且相邻的陆地都变成海洋，然后再重新遍历地图，统计还剩下的陆地就可以了。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第51天|99. 岛屿数量、100. 岛屿的最大面积]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141356498</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141356498</guid><author>Yinems</author><pubDate>Tue, 20 Aug 2024 16:37:43 +0800</pubDate><description><![CDATA[在 Python 中，global 关键字用于在函数内部声明一个变量是全局变量，而不是函数内部的局部变量。使用 global 可以使得函数内部对变量的修改反映到函数外部的全局范围。本题思路，是用遇到的一个没有遍历过的节点陆地，计数器加一，然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过陆地节点和海洋节点都直接跳过，这样计数器就是最终岛屿的数量。只要节点加入队列就代表走过，就需要标记，而不是从队列拿出来的时候再标记走过。这道题在上一题的基础上需要统计岛屿的面积。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第50天|98. 所有可达路径]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141334144</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141334144</guid><author>Yinems</author><pubDate>Tue, 20 Aug 2024 13:48:58 +0800</pubDate><description><![CDATA[在有向图中，每个节点有出度和入度，出度指从该节点出发的边的个数，而入度是指向该节点边的个数。度：无向图中有几条边连接该节点，该节点就有几度。广搜适合于解决两个点之间的最短路径问题。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第49天|42. 接雨水、84.柱状图中最大的矩形]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141329106</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141329106</guid><author>Yinems</author><pubDate>Mon, 19 Aug 2024 20:22:40 +0800</pubDate><description><![CDATA[单调栈是按行来计算雨水，栈是按递增的顺序，一旦发现添加的柱子高度大于栈头元素，此时出现凹槽，栈头元素是凹槽底部的柱子，栈头的第二个元素是凹槽左边的柱子，而添加的元素是凹槽右边的柱子。为什么在数组前加0：计算矩阵面积的三个要素，当前遍历的元素值，也就是判断完要入栈的元素值，也就是矩形的右边，栈顶第一个元素是当前矩形的高度，栈顶的第二个元素是左边，在数组前加0的目的在于是的栈顶第二个元素不为空。每一列雨水的高度，取决于该列最侧最高的柱子和右侧最高的柱子中最矮的柱子的高度。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第48天|739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141305497</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141305497</guid><author>Yinems</author><pubDate>Mon, 19 Aug 2024 16:32:55 +0800</pubDate><description><![CDATA[单调栈的本质是空间换时间，因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素，优点是整个数组只需要遍历一次。在本题中，需要寻找右边第一个比自己大的元素，从栈头到栈底是递增的顺序，这样要加入当前元素的时候，可以得到栈顶元素在数组右边第一个更大的值是当前元素。这道题还是用单调栈来做，从栈顶到栈底是递增的顺序，思路是一样的，根据题目要求，考虑到要在nums2对应位置往后寻找第一个更大的元素，因此需要遍历nums2。解决循环数组只需要遍历的过程中模拟走两遍。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第47天| 647. 回文子串、516.最长回文子序列]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141285306</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141285306</guid><author>Yinems</author><pubDate>Sun, 18 Aug 2024 21:02:42 +0800</pubDate><description><![CDATA[如果s[i]和s[j]相等，如果i=j，则dp[i][j]=True；如果j-i>1，当d[i+1][j-1]=True时，dp[i][j]=True。如果s[i]和s[j]相等，那么dp[i][j]=dp[i+1][j-1]+2；如果不等，dp[i][j]=max(dp[i+1][j],dp[i][j-1])dp[i][j]表示区间范围[i,j]（左闭右闭）的子串是否是回文子串。dp[i + 1][j - 1] 在 dp[i][j]的左下角，遍历i从底向上，j从前往后。dp[i][i]=1，其余为0。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第46天|115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141267764</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141267764</guid><author>Yinems</author><pubDate>Sat, 17 Aug 2024 19:20:19 +0800</pubDate><description><![CDATA[如果不相等，A删除][i-1]，则为dp[i-1][j]+1，B删除[j-1]，等同于A增加，则为dp[i][j-1] + 1，A替换元素，则为dp[i-1][j-1]+1，因此取三种情况的最小值。如果 s[i-1] 和 t[j-1] 相等，有两种情况，使用s[i-1]进行匹配或者不使用，因此，dp[i][j] = dp[i-1][j-1] + dp[i-1][j]。如果不相等，dp[i][j] = min(dp[i-1][j-1] + 2,dp[i-1][j] +1,dp[i][j-1] +1)]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第44天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141244987</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141244987</guid><author>Yinems</author><pubDate>Fri, 16 Aug 2024 19:22:45 +0800</pubDate><description><![CDATA[我想叉了，A字符串为‘abcde’，B字符串为’ace’，在比较到 c 相等时，dp[i][j] = dp[i-1][j-1] + 1，因为dp[i-1][j-1]的值并不是指最长子序列必须以[i-1]和[j-1]这两个字母结尾，就是说，c相等，只需要在’ab’和’a’的最长子序列的长度上加一就行，并不需要去纠结 c 前面两个字符串哪个字符相等。如果A[i-1]=B[j-1]，那么dp[i][j] = dp[i-1][j-1] + 1。（1）确定数组和下标。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第43天|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141196330</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141196330</guid><author>Yinems</author><pubDate>Thu, 15 Aug 2024 11:44:05 +0800</pubDate><description><![CDATA[我一下子就想到之前做过的求最长摆动子序列长度的那道贪心算法题，想通过峰值来求最长递增子序列长度，但没想到，以[0,1,0,3,2,3]为例，从峰值看，0-1-3，只有三段，实际上可以加入2变成长度为4。使用2维数组来定义，dp[i][j]表示A中 i-1 个元素结尾，B中 j-1 个元素结尾的子数组的最大长度；如果numsA[i-1] = numsB[j-1]，那么dp[i][j] = dp[i-1][j-1] + 1。找到比nums[i]小的元素 j，dp[i]取dp[j] + 1中的最大值。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第42天|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141164431</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141164431</guid><author>Yinems</author><pubDate>Wed, 14 Aug 2024 17:28:55 +0800</pubDate><description><![CDATA[今天买入，可以由0和3状态得到，dp[i-1][1] - prices[i]或者dp[i-1][3] - prices[i]dp[i][2]：第 i 天卖出股票，那么则为dp[i-1][1] + prices[i]；dp[i][1]：第 i 天买入股票，那么则为dp[i-1][0]- prices[i]；dp[i][1]：之前卖出，dp[i-1][1]；dp[i][j为奇数] = -prices[0],dp[0][j为偶数] = 0；dp[i][1]：dp[i-1][1]或者dp[i-1][3]]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第41天|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/141154550</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/141154550</guid><author>Yinems</author><pubDate>Tue, 13 Aug 2024 15:03:27 +0800</pubDate><description><![CDATA[dp[i][0]：持有股票有两种情况，一种是股票在之前买入，那么则为dp[i - 1][0]；dp[i][1]：不持有股票的两种情况，一种是之前就卖掉了，则为dp[i-1][1]；dp[i][0]：持有股票有两种情况，一种是股票在之前买入，那么则为dp[i - 1][0]；dp[i][1]：不持有股票的两种情况，一种是之前就卖掉了，则为dp[i-1][1]；dp[i][0]表示第一次持有股票，dp[i][1]表示第一次不持有，dp[i][2]表示第二次持有，dp[i][3]表示第二次不持有。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第40天|198.打家劫舍、213.打家劫舍II、337.打家劫舍 III]]></title><link>https://blog.youkuaiyun.com/Yinems/article/details/140928380</link><guid>https://blog.youkuaiyun.com/Yinems/article/details/140928380</guid><author>Yinems</author><pubDate>Mon, 12 Aug 2024 16:11:52 +0800</pubDate><description><![CDATA[单层递归逻辑，该节点不偷，左右孩子都可以考虑偷，dp[0] = max（leftdp[0], leftdp[1]）+ max（rightdp[0], rightdp[1]）；该节点偷，那么左右孩子不偷，dp[1] = node.value + leftdp[0] + rightdp[0]。那么则为dp[ i ] = max（dp[ i-2 ] + nums[ i ], dp[ i-1 ]）dp[0] = nums[0]，dp[1] = max（nums[0], nums[1]），其余为0。]]></description><category></category></item></channel></rss>