<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Reman0的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Reman0</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Reman0]]></copyright><item><title><![CDATA[leetcode131]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/127482258</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/127482258</guid><author>Reman0</author><pubDate>Sun, 23 Oct 2022 22:26:22 +0800</pubDate><description><![CDATA[时间复杂度：回溯的过程相当于遍历一棵n叉树，本题判断子串是否为回文只有是和不是两种情况，因此是一个二叉树，最坏情况下有n个回文子串，层数是串的长度n，因此是O(2^n)。每一种方案需要遍历子串求出结果，也就是O(n)，因此总的时间复杂度就是O(n*2^n)。要将字符串分割成回文子串，首先想到的是回溯，遍历字符串，然后判断该子串是否是回文子串，如果是的话，那么进入下一层继续分割。如果是回文子串，那么返回1。给定一个字符串，要求将字符串分割成为回文子串，问有多少种分割方案？空间复杂度：O(n^2)]]></description><category></category></item><item><title><![CDATA[leetcode912]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/127251709</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/127251709</guid><author>Reman0</author><pubDate>Mon, 10 Oct 2022 20:44:45 +0800</pubDate><description><![CDATA[思想：设置两个指针，一个low和一个high，每次取出当前数组的第一个节点作为privot，然后与指针high进行比较，直到不满足，那么将该值交换到low所在的位置；先建堆，本题建立的是大顶堆，也就是升序排序。从数组的中点开始调整堆，使得每个父节点都比它的左右子节点要大。建完堆之后，每次取出根节点（也就是最大的节点），取出的元素放置在数组的最后，然后重新从根节点开始调整堆。思想：需要声明临时的数组，每次都对数组进行对半分割，然后比较前半部分和后半部分，将较小值存入临时数组。]]></description><category></category></item><item><title><![CDATA[重建二叉树]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/127149434</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/127149434</guid><author>Reman0</author><pubDate>Mon, 03 Oct 2022 11:38:20 +0800</pubDate><description><![CDATA[在中序数组中寻找根节点的时候需要O(n)遍历才能得到，可以先用一个哈希表存储起来，之后只要O(1)即可找到根节点在中序数组中的位置。思路：先根据二叉树的的前序遍历确定根节点，然后再根据中序遍历确定根节点的左右子树进行建树。]]></description><category></category></item><item><title><![CDATA[leetcode788]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/127039928</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/127039928</guid><author>Reman0</author><pubDate>Sun, 25 Sep 2022 17:41:34 +0800</pubDate><description><![CDATA[做完看了一下别人的题解发现可以用数位dp做。思路就是将数字转化为字符串，然后声明一个dp数组来记忆化搜索过的状态。思路：只有题目中出现2 5 6 9才可能是好数，如果出现了3 4 7，那么直接返回false。数据范围是[1, 10000]，所以暴力枚举可以过。设置一个dif数组对10个数字进行分类。]]></description><category></category></item><item><title><![CDATA[leetcode6183]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/126917674</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/126917674</guid><author>Reman0</author><pubDate>Sun, 18 Sep 2022 16:54:50 +0800</pubDate><description><![CDATA[刚开始一直在用哈希，结果超时了，然后再开了一个哈希表优化了一下，没想到还是超时。左思右想想不到其它方法，看了题解才知道可以用字典树。前缀+字符串，这不是妥妥的字典树吗，看来是字典树的知识都快忘完了。思路：根据所有的词根构建一棵前缀树，然后拿到句子的每个单词去遍历，如果遍历到的节点是词根的节点，那么用这个词根替换原句子中的单词。思路：构建一棵前缀树，开一个26大小的结构体数组来存储，每经过一个节点就在该节点的位置加1，表示以该节点结尾的前缀单词的数量。题意：将一个句子中的所有单词替换为该单词的词根。]]></description><category></category></item><item><title><![CDATA[leetcode394]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/126808149</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/126808149</guid><author>Reman0</author><pubDate>Sun, 11 Sep 2022 23:45:02 +0800</pubDate><description><![CDATA[3. 如果遇到的是 '['，那么截断字符串，把当前字符串和数字分别入栈。4. 如果遇到的是 ']'，那么弹出数字栈中的数字然后加到栈顶的字符串。2. 当遇到的是字符，那么加到当前字符串上。1. 当遇到数字，那么累加。]]></description><category></category></item><item><title><![CDATA[leetcode6168]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/126689488</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/126689488</guid><author>Reman0</author><pubDate>Sun, 04 Sep 2022 15:26:19 +0800</pubDate><description><![CDATA[搜索的时候可以记录下当前的状态，当前状态位于cur，还可以走step步，那么可以给当前状态这是一个唯一的key记录下来。题目的数据范围都是在1000以内，所以乘以一个大于1000的数即可确定当前状态的唯一key。题意：给定一个起点s和一个终点e，还有一个整数k，算出恰好走k步可以从s到达e的方法数。以步数为外层循环，依次计算每一种步数的情况下到达每一个位置的方法数。刚开始就是纯暴力，但是一直超时，并没有想到可以用记忆化。想过用动态规划，状态转移也知道，但是不能确定遍历顺序。]]></description><category></category></item><item><title><![CDATA[leeetcode239]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/126559388</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/126559388</guid><author>Reman0</author><pubDate>Sat, 27 Aug 2022 16:37:43 +0800</pubDate><description><![CDATA[1. 最开始想到的是采用单调队列，队列维护从大到小的值的下标，这样就可以判断队首的下标是否在滑动窗口的范围之外，如果在范围之外，那么弹出队列的下标。如果当前位置大于等于k-1时，开始加入最大值。思路2：后来看答案的时候发现还可以用优先队列，队列存储的是，每次判断堆顶的下标是否在窗口之内。题意：给定一个数组和一个窗口大小k，从左往右滑动窗口，依次求出窗口中的最大值。...]]></description><category></category></item><item><title><![CDATA[leetcode2376]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/126451760</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/126451760</guid><author>Reman0</author><pubDate>Sun, 21 Aug 2022 16:36:25 +0800</pubDate><description><![CDATA[用一个状态位status来表示0-9之间的数字是否被选中，例如 1100000001，表示0、8、9这三个数字已经被选中，所以要有一个参数pos来记录当前的位置。这两个参数就帮助我们记忆化了之前搜索过的。现在我们还需要第3个参数limit，这个参数表示当前位可选的数字是否收到上一位的限制，例如，对于数字1234，如果第3位选择的数字是3，那么第4位可选的数字就是0-4，否则就是0-9。数位dp的时间复杂度等于 状态个数*转移个数，对于本题就是 O(2^n * n)，n是数组num的长度。]]></description><category></category></item><item><title><![CDATA[grpc初体验]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/126323547</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/126323547</guid><author>Reman0</author><pubDate>Sat, 13 Aug 2022 21:46:36 +0800</pubDate><description><![CDATA[到github下载protoc用于编译proto文件 ==>下载链接然后在将下载完毕后的bin目录配置到环境变量中这里有个坑：安装的时候需要将go env中的GOOS设置为windows(使用go env -w GOOS=windows)，否则GOPATH/bin下不会有如下的两个.exe文件。............]]></description><category></category></item><item><title><![CDATA[leetcode6138]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/126213543</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/126213543</guid><author>Reman0</author><pubDate>Sun, 07 Aug 2022 17:01:34 +0800</pubDate><description><![CDATA[2. 遍历给定的字符串，然后将当前字符与每个字母结尾的序列依次比较，在所有绝对值小于等于k的字符中取最大值。1. 定义dp数组dp[i]，表示以字符i为结尾的满足题意的最长子序列。]]></description><category></category></item><item><title><![CDATA[github Actions]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/126076582</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/126076582</guid><author>Reman0</author><pubDate>Sun, 31 Jul 2022 23:10:52 +0800</pubDate><description><![CDATA[yuminstall-ywget&&wget-Oinstall.shhttp//download.bt.cn/install/install_6.0.sh&&bashinstall.sh(版本为centos7)2）本次代码打包为一个dist文件，将dist文件夹下的所有文件上传到宝塔上的dist文件夹。域名添加自己的服务器ip，目录选择刚刚上一步创建的文件夹，然后提交。2）在远程github上新建一个仓库，将该仓库与本地的项目建立连接。1）先删除宝塔上的dist目录下的所有文件。......]]></description><category></category></item><item><title><![CDATA[leetcode]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/125963314</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/125963314</guid><author>Reman0</author><pubDate>Sun, 24 Jul 2022 21:09:25 +0800</pubDate><description><![CDATA[给定一个数组nums，数组的每一个位置放置一个气球，戳爆第i个气球可以获得nums[i-1]*nums[i]*nums[i+1]的值，问如何才能使最终获得的值最大。注意题目的边界处理问题，当气球的位置为0或者n-1的时候当做1处理，可以多开一个n+2的数组来重新存储这些数字，然后令i=0和i=n+1的位置为1，其它位置复制原数组。当我们在计算区间[i,j]的时候，依赖于区间[i,k]和区间[k,j]，所以需要从后往前遍历。这题是hard难度的，想了半天确实想不出来，那就看官方题解好好学习一下吧。...]]></description><category></category></item><item><title><![CDATA[leetcode6121]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/125832519</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/125832519</guid><author>Reman0</author><pubDate>Sun, 17 Jul 2022 17:40:05 +0800</pubDate><description><![CDATA[题目给的数字是字符串，而且长度可以达到100。可以采用基数排序，开辟一个二维数组，从低位开始存储，arr[i][j]表示在nums[i]从右数第i位的所有数字中的第j小的下标。每一轮存储的数字放在一个桶中。然后在依次将桶中的结果连接起来，最后再通过根据queries数组得出结果。例如对于数字123，654，491....]]></description><category></category></item><item><title><![CDATA[leetcode188]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/125706360</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/125706360</guid><author>Reman0</author><pubDate>Sun, 10 Jul 2022 17:00:38 +0800</pubDate><description><![CDATA[题目：给定一个整数数组prices表示每一天的股票票价，最多可以进行k次交易，最大利润是多少。(你只能在卖出这支股票之后才能进行买入操作)1. 可以定义两个状态数组buy和sell。buy[i][j]表示在第i支股票时，进行了j次交易的最大利润，并且此时手上还有一支股票。sell[i][j]表示正在第i支股票时，进行了j次交易的最大利润。2. 状态转移方程：buy[i][j] = max{buy[i-1][j], sell[i-1][j] - prices[i]}可以是在第i天之前买入的，也可以是第i天买入]]></description><category></category></item><item><title><![CDATA[leetcode1703]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/125574532</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/125574532</guid><author>Reman0</author><pubDate>Sat, 02 Jul 2022 19:53:18 +0800</pubDate><description><![CDATA[得到连续k个1的最少交换次数题目：给定一个只有0和1的数组和一个数字k，返回得到k个连续的1的最少交换次数。这道题是python期末考试的附加题，并且是leetcode原题hard难度，考场上愣是没想出来，考完看别人的题解学习一下。思路：题目需要求解最小交换次数，因此只需要考虑0和1之间的交换，如果交换00和01只会增加交换次数。我们可以将每个1的下标存起来，假设这些下标分别是a1，a2，a3....ak。然后需要把这些下标移动到一个连续的长度为k的区间:x,x+1,x+2...x+k-1。那么现在的问题就]]></description><category></category></item><item><title><![CDATA[leetcode494]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/125469796</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/125469796</guid><author>Reman0</author><pubDate>Sun, 26 Jun 2022 15:22:44 +0800</pubDate><description><![CDATA[目标和题目：给你一个整数数组和一个目标值，对数组中的所有数字可以使用+或-使其和为目标值，问有多少种方式。这道题之前用了回溯的方式来做，结果运行了1秒多，效率十分低下。这次借鉴了别人01背包的做法，感觉十分巧妙。解法：对于数组中的数字，可以将其分为两部分，一部分为使用+的数字，和为sumA，另一部分为使用了-的数字，和为sumB，根据题意可以得到如下的式子：(1)sumA + sumB = sum(2)sumA - sumB = target将上述两个式子相加得到：2sumA = sum + target，]]></description><category></category></item><item><title><![CDATA[leetcode309]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/125360297</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/125360297</guid><author>Reman0</author><pubDate>Sun, 19 Jun 2022 18:58:22 +0800</pubDate><description><![CDATA[最佳买卖股票时机含冷冻期题目：每天可以选择可以买入卖出或者继续持有一笔股票，只有卖出之后才能重新买入一笔股票，并且卖出股票之后的第一天处于冷冻期，不能买入股票。问如何才能拿到最大收益？思路：每一天的收益状态都是依赖于前一天收益状态的。因此可以对每一天分为三种情况：情况1：持有该笔股票的最大收益，这一笔股票可以是今天买入的，也可以是本来就有的。情况2：不持有该笔股票并且处于冷冻期的最大收益，也就是昨天卖出了这笔股票。情况3：不持有该笔股票并且不处于冷冻期的最大收益，昨天可能是冷冻期也可能不是。可以定义一个二维]]></description><category></category></item><item><title><![CDATA[leetcode221 & leetcode56]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/125248364</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/125248364</guid><author>Reman0</author><pubDate>Sun, 12 Jun 2022 19:20:30 +0800</pubDate><description><![CDATA[最大正方形题目大意：给定一个只有0和1的矩阵，找出矩阵中能组成全是1的最大正方形。思路：要求矩阵的最大面积，可以转化为求解矩阵的最大边长。定义一个二维的dp数组，dp[i][j]表示以（i，j）为右下角的正方形的最大边长。对于dp数组应该如何求解呢？遍历到当前位置（i，j）的时候，需要考虑（i-1，j），（i，j-1），（i-1，j-1）三个位置，因为要得到的是一个正方形，故需要取这三个位置中的最小值。得到如何状态转移方程：


答案也就顺其自然出来了：


合并区间这是上周的mini项目考试原题，考完之后]]></description><category></category></item><item><title><![CDATA[leetcode91]]></title><link>https://blog.youkuaiyun.com/Reman0/article/details/125124931</link><guid>https://blog.youkuaiyun.com/Reman0/article/details/125124931</guid><author>Reman0</author><pubDate>Sat, 04 Jun 2022 20:09:35 +0800</pubDate><description><![CDATA[解码方法：https://leetcode.cn/problems/decode-ways/submissions/思路：题目中要求求出数字到字母的映射，需要注意前导零的处理，像这种全局最优依赖于局部最优的问题就需要使用动态规划来求解了。首先对字符串进行遍历，每次都需要考虑前一位的数字，用a代表当前位置的数字，用b代表前一位与当前位置组成的数字，如果b能组成满足题目的数字的话(也就是b>=10&&b...]]></description><category></category></item></channel></rss>