<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[gyjllll的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/gyjllll</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; gyjllll]]></copyright><item><title><![CDATA[判断两个长方形是否重叠]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/141275889</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/141275889</guid><author>gyjllll</author><pubDate>Sat, 17 Aug 2024 09:43:28 +0800</pubDate><description><![CDATA[判断两个长方形是否有重叠，主要涉及到对两个长方形的边界进行比较。假设我们有两个长方形，分别定义为 rect1 和 rect2。每个长方形可以用其左下角和右上角的坐标来表示。如果上述条件之一成立，则两个长方形不重叠。rect1 的右边界在 rect2 的左边界的左侧。rect1 的左边界在 rect2 的右边界的右侧。rect1 的上边界在 rect2 的下边界的下方。rect1 的下边界在 rect2 的上边界的上方。2. C++实现代码。]]></description><category></category></item><item><title><![CDATA[向量点乘与叉乘]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/141275769</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/141275769</guid><author>gyjllll</author><pubDate>Sat, 17 Aug 2024 09:30:54 +0800</pubDate><description><![CDATA[转载此博主。]]></description><category></category></item><item><title><![CDATA[利用向量叉乘计算点到直线距离]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/141275453</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/141275453</guid><author>gyjllll</author><pubDate>Sat, 17 Aug 2024 09:06:43 +0800</pubDate><description><![CDATA[那么向量AB与向量AP的叉乘的模就是以ABP三点形成的平行四边形面积，这样求P到AB距离，就可以用向量叉乘模长除以底边AB长度即可。如果说一条线段的两个端点坐标分别是。主要利用到向量叉乘的意义。]]></description><category></category></item><item><title><![CDATA[C++归并排序]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/141240481</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/141240481</guid><author>gyjllll</author><pubDate>Fri, 16 Aug 2024 08:22:23 +0800</pubDate><description><![CDATA[1. merge 函数: 这个函数负责将两个有序的子数组合并成一个有序的数组。它使用两个临时数组 leftArr 和 rightArr 来存储左半部分和右半部分的数据，然后将它们合并到原数组中。归并排序（Merge Sort）是一种基于分治法的排序算法。它将数组分成两个子数组，分别对它们进行排序，然后将已排序的子数组合并成一个有序数组。2. mergeSort 函数: 这是归并排序的核心递归函数。它将数组分成两半，分别进行排序，然后调用 merge 函数将它们合并。]]></description><category></category></item><item><title><![CDATA[543. 二叉树的直径]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140945775</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140945775</guid><author>gyjllll</author><pubDate>Tue, 06 Aug 2024 09:33:29 +0800</pubDate><description><![CDATA[假设我们知道对于该节点的左儿子向下遍历经过最多的节点数 L （即以左儿子为根的子树的深度） 和其右儿子向下遍历经过最多的节点数 R （即以右儿子为根的子树的深度），那么以该节点为起点的路径经过节点数的最大值即为 L+R+1。如图我们可以知道路径 [9, 4, 2, 5, 7, 8] 可以被看作以 2 为起点，从其左儿子向下遍历的路径 [2, 4, 9] 和从其右儿子向下遍历的路径 [2, 5, 7, 8] 拼接得到。3 ，取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。由它们之间边数表示。]]></description><category></category></item><item><title><![CDATA[21. 合并两个有序链表]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140890492</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140890492</guid><author>gyjllll</author><pubDate>Sat, 03 Aug 2024 14:45:47 +0800</pubDate><description><![CDATA[然后，我们重复以下过程，直到 l1 或者 l2 指向了 null ：如果 l1 当前节点的值小于等于 l2 ，我们就把 l1 当前的节点接在 prev 节点的后面同时将 l1 指针往后移一位。由于输入的两个链表都是有序的，所以不管哪个链表是非空的，它包含的所有元素都比前面已经合并链表中的所有元素都要大。当 l1 和 l2 都不是空链表时，判断 l1 和 l2 哪一个链表的头节点的值更小，将较小值的节点添加到结果里，当一个节点被添加到结果里之后，将对应链表中的节点向后移一位。将两个升序链表合并为一个新的。]]></description><category></category></item><item><title><![CDATA[234. 回文链表]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140889576</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140889576</guid><author>gyjllll</author><pubDate>Sat, 03 Aug 2024 13:44:45 +0800</pubDate><description><![CDATA[我们可以将链表的后半部分反转（修改链表结构），然后将前半部分和后半部分进行比较。我们也可以使用快慢指针在一次遍历中找到：慢指针一次走一步，快指针一次走两步，快慢指针同时出发。当快指针移动到链表的末尾时，慢指针恰好到链表的中间。在并发环境下，函数运行时需要锁定其他线程或进程对链表的访问，因为在函数执行过程中链表会被修改。步骤三比较两个部分的值，当后半部分到达末尾则比较完成，可以忽略计数情况中的中间节点。执行步骤一，我们可以计算链表节点的数量，然后遍历链表找到前半部分的尾节点。找到前半部分链表的尾节点。]]></description><category></category></item><item><title><![CDATA[287. 寻找重复数]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140885543</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140885543</guid><author>gyjllll</author><pubDate>Sat, 03 Aug 2024 09:30:28 +0800</pubDate><description><![CDATA[同样的，我们从下标为 0 出发，根据 f(n) 计算出一个值，以这个值为新的下标，再用这个函数计算，以此类推产生一个类似链表一样的序列。如果数组中有重复的数，以数组 [1,3,4,2,2] 为例,我们将数组下标 n 和数 nums[n] 建立一个映射关系 f(n)，如果数组中没有重复的数，以数组 [1,3,4,2]为例，我们将数组下标 n 和数 nums[n] 建立一个映射关系 f(n)，从理论上讲，数组中如果有重复的数，那么就会产生多对一的映射，这样，形成的链表就一定会有环路了，你设计的解决方案必须。]]></description><category></category></item><item><title><![CDATA[32. 最长有效括号]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140884864</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140884864</guid><author>gyjllll</author><pubDate>Sat, 03 Aug 2024 08:45:16 +0800</pubDate><description><![CDATA[我们考虑如果倒数第二个 ‘)’ 是一个有效子字符串的一部分（记作 subs），对于最后一个 ‘)’ ，如果它是一个更长子字符串的一部分，那么它一定有一个对应的 ‘(’ ，且它的位置在倒数第二个 ‘)’ 所在的有效子字符串的前面（也就是 subs的前面）。第二种情况同理，需要把有效子串 “(subs)” 之前的有效子串的长度也加上，也就是再加上 dp[i−dp[i−1]−2]，如果i−dp[i−1]−2比0小，说明遇到了刚才的情况，已经到数组边界了，就没有之前的有效子串了，因此要用0+2。]]></description><category></category></item><item><title><![CDATA[295. 数据流的中位数]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140884666</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140884666</guid><author>gyjllll</author><pubDate>Sat, 03 Aug 2024 08:12:31 +0800</pubDate><description><![CDATA[当累计添加的数的数量为奇数时，queMin 中的数的数量比 queMax 多一个，此时中位数为 queMin 的队头。当累计添加的数的数量为偶数时，两个优先队列中的数的数量相同，此时中位数为它们的队头的平均值。新的中位数将小于等于原来的中位数，因此我们可能需要将 queMin 中最大的数移动到 queMax 中。新的中位数将大于等于原来的中位数，因此我们可能需要将 queMax 中最小的数移动到 queMin 中。特别地，当累计添加的数的数量为 0 时，我们将 num 添加到 queMin 中。]]></description><category></category></item><item><title><![CDATA[C++快速排序]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140881096</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140881096</guid><author>gyjllll</author><pubDate>Fri, 02 Aug 2024 21:59:50 +0800</pubDate><description><![CDATA[（5）向右走，从数组的左边位置向右找，一直找到比 pivot 大的数，这是 i=j，第一轮排序结束，返回 i 的位置，mid=i。（2）向左走，从数组的右边位置向左找，一直找到小于等于 pivot 的数，找到R[j]=12，R[i]与R[j]交换，i++。（4）向左走，从数组的右边位置向左找，一直找到小于等于 pivot 的数，找到R[j]=18，R[i]与R[j]交换，i++。同时选取首元素为基准元素。下面我将以序列（30，24，5，58，18，36，12，42，39）为例，进行图解。]]></description><category></category></item><item><title><![CDATA[394. 字符串解码]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140879846</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140879846</guid><author>gyjllll</author><pubDate>Fri, 02 Aug 2024 20:37:40 +0800</pubDate><description><![CDATA[本题中可能出现括号嵌套的情况，比如 2[a2[bc]]，这种情况下我们可以先转化成 2[abcbc]，在转化成 abcbcabcbc。如果当前的字符为右括号，开始出栈，一直到左括号出栈，出栈序列反转后拼接成一个字符串，此时取出栈顶的数字（此时栈顶一定是数字），就是这个字符串应该出现的次数，我们根据这个次数和字符串构造出新的字符串并进栈。重复如上操作，最终将栈中的元素按照从栈底到栈顶的顺序拼接起来，就得到了答案。此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数。，表示其中方括号内部的。]]></description><category></category></item><item><title><![CDATA[155. 最小栈]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140877788</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140877788</guid><author>gyjllll</author><pubDate>Fri, 02 Aug 2024 18:28:04 +0800</pubDate><description><![CDATA[对于栈来说，如果一个元素 a 在入栈时，栈里有其它的元素 b, c, d，那么无论这个栈在之后经历了什么操作，只要 a 在栈中，b, c, d 就一定在栈中，因为在 a 被弹出之前，b, c, d 不会被弹出。因此，在操作过程中的任意一个时刻，只要栈顶的元素是 a，那么我们就可以确定栈里面现在的元素一定是 a, b, c, d。当一个元素要入栈时，我们取当前辅助栈的栈顶存储的最小值，与当前元素比较得出最小值，将这个最小值插入辅助栈中；在任意一个时刻，栈内元素的最小值就存储在辅助栈的栈顶元素中。]]></description><category></category></item><item><title><![CDATA[51. N 皇后]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140876511</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140876511</guid><author>gyjllll</author><pubDate>Fri, 02 Aug 2024 17:38:12 +0800</pubDate><description><![CDATA[按照国际象棋的规则，皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。研究的是如何将n个皇后放置在n×n的棋盘上，并且使皇后彼此之间不能相互攻击。给你一个整数n，返回所有不同的的解决方案。每一种解法包含一个不同的的棋子放置方案，该方案中'Q'和'.'分别代表了皇后和空位。n = 4如上图所示，4 皇后问题存在两个不同的解法。]]></description><category></category></item><item><title><![CDATA[79. 单词搜索]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140832845</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140832845</guid><author>gyjllll</author><pubDate>Wed, 31 Jul 2024 21:31:26 +0800</pubDate><description><![CDATA[里面具体搜索就是利用for循环4个方向，用当前传入的xy节点进行扩展，扩展的新节点如果没访问过并且这个点和word当前索引下的字母一样，则添加到路径，标记为访问过，进行dfs，同时进行回溯，在把路径点退出，点变成未访问过，这是由于如果dfs搜索失败了，没有找到匹配点，那么回溯之后，这条路径上往后失败的点全要恢复原样，不影响下次搜索。单词必须按照字母顺序，通过相邻的单元格内的字母构成，其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。你可以使用搜索剪枝的技术来优化解决方案，使其在。]]></description><category></category></item><item><title><![CDATA[208. 实现 Trie (前缀树)]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140776682</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140776682</guid><author>gyjllll</author><pubDate>Mon, 29 Jul 2024 17:33:58 +0800</pubDate><description><![CDATA[创建一个新的子节点，记录在 children 数组的对应位置上，然后沿着指针移动到子节点，继续搜索下一个字符。若搜索到了前缀的末尾，就说明字典树中存在该前缀。此外，若前缀末尾对应节点的 isEnd 为真，则说明字典树中存在该字符串。重复以上步骤，直到处理字符串的最后一个字符，然后将当前节点标记为字符串的结尾。重复以上步骤，直到返回空指针或搜索完前缀的最后一个字符。沿着指针移动到子节点，继续处理下一个字符。沿着指针移动到子节点，继续搜索下一个字符。布尔字段 isEnd，表示该节点是否为字符串的结尾。]]></description><category></category></item><item><title><![CDATA[207. 课程表]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140772854</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140772854</guid><author>gyjllll</author><pubDate>Mon, 29 Jul 2024 15:59:51 +0800</pubDate><description><![CDATA[使用DFS进行搜索遍历，要先将本题输入进行处理，先构建二维数组把图弄出来，这个二维数组里面的第一组元素代表0号课程节点可以到达的节点，意味着第一组元素的课程的先导课程是0，第二个元素就是1为祖先，1号课程可以到的下一个节点课程，以此类推，把这个二维数组的大小设为课程数。由于我们只需要判断是否存在一种拓扑排序，而栈的作用仅仅是存放最终的拓扑排序结果，因此我们可以只记录每个节点的状态，而省去对应的栈，建立一个visited数组，大小和节点数目一样，0代表未搜索，1代表搜索中，2代表此轮结束回溯，搜索完成。]]></description><category></category></item><item><title><![CDATA[124. 二叉树中的最大路径和]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140770789</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140770789</guid><author>gyjllll</author><pubDate>Mon, 29 Jul 2024 14:38:19 +0800</pubDate><description><![CDATA[对于二叉树中的一个节点，该节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值，如果子节点的最大贡献值为正，则计入该节点的最大路径和，否则不计入该节点的最大路径和。首先，考虑实现一个简化的函数 maxGain(node)，该函数计算二叉树中的一个节点的最大贡献值，具体而言，就是在以该节点为根节点的子树中寻找以该节点为起点的一条路径，使得该路径上的节点值之和最大。非空节点的最大贡献值等于节点值与其子节点中的最大贡献值之和（对于叶节点而言，最大贡献值等于节点值）。空节点的最大贡献值等于 0。]]></description><category></category></item><item><title><![CDATA[146. LRU 缓存]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140769014</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140769014</guid><author>gyjllll</author><pubDate>Mon, 29 Jul 2024 13:34:32 +0800</pubDate><description><![CDATA[上述各项操作中，访问哈希表的时间复杂度为 O(1)，在双向链表的头部添加节点、在双向链表的尾部删除节点的复杂度也为 O(1)。而将一个节点移到双向链表的头部，可以分成「删除该节点」和「在双向链表的头部添加节点」两步操作，都可以在 O(1) 时间内完成。这样以来，我们首先使用哈希表进行定位，找出缓存项在双向链表中的位置，随后将其移动到双向链表的头部，即可在 O(1) 的时间内完成 get 或者 put 操作。通过哈希表定位到该节点在双向链表中的位置，并将其移动到双向链表的头部，最后返回该节点的值。]]></description><category></category></item><item><title><![CDATA[23. 合并 K 个升序链表]]></title><link>https://blog.youkuaiyun.com/gyjllll/article/details/140767139</link><guid>https://blog.youkuaiyun.com/gyjllll/article/details/140767139</guid><author>gyjllll</author><pubDate>Mon, 29 Jul 2024 11:35:21 +0800</pubDate><description><![CDATA[注意这里的描述，tail 不是下一个插入的位置，aPtr 和 bPtr 所指向的元素处于待合并的状态，也就是说它们还没有合并入最终的链表。首先我们需要一个变量 head 来保存合并之后链表的头部，你可以把 head 设置为一个虚拟的头（也就是 head 的 val 属性不保存任何值），这是为了方便代码的书写，在整个链表合并完之后，返回它的下一位置即可。本题可以用一个变量result来维护以及合并的链表，第 i 次循环把第 i 个链表和 result 合并，答案保存到 result 中。]]></description><category></category></item></channel></rss>