<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[BetweenRain的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/BetweenRain</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; BetweenRain]]></copyright><item><title><![CDATA[正则表达式]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/79556618</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/79556618</guid><author>BetweenRain</author><pubDate>Wed, 14 Mar 2018 16:41:21 +0800</pubDate><description><![CDATA[作者：idreamagic链接：https://www.zhihu.com/question/36111342/answer/149879434来源：知乎著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。1.正则表达式基本语法两个特殊的符号'^'和'$'。他们的作用是分别指出一个字符串的开始和结束。例子如下：&quot;^The&quot;：表示所有以&quot;The&quot;开始的字符串（&quot;There&quot;，&quot;The...]]></description><category></category></item><item><title><![CDATA[45. Jump Game II（跳跃游戏之二）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/79114016</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/79114016</guid><author>BetweenRain</author><pubDate>Sat, 20 Jan 2018 14:25:42 +0800</pubDate><description><![CDATA[这道题其实也不算难，只是要在每一次跳跃时，判断在进行每一次跳跃所能跳跃的最大距离，然后通过循环计算在这段距离内下一次跳跃所能跳跃的最远距离，记录下当前的局部最远距离与位置值，接着更新循环的初始值（位置值）与终止值（局部最远距离），这样就能确保每一次跳跃都是最优解。
class Solution {
public:
    int jump(vector& nums) {
        int ]]></description><category></category></item><item><title><![CDATA[55. Jump Game（跳跃游戏）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/79113957</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/79113957</guid><author>BetweenRain</author><pubDate>Sat, 20 Jan 2018 14:17:02 +0800</pubDate><description><![CDATA[这道题也是动态规划经典题，简单的说，可以从最后开始往回跳这个思路入手。首先要des变量保存为最后需要跳到的位置，然后往回一步一步跳，若在某个位置可以跳到最后的des位置，即往回跳，同时更新des为当前位置的值。
class Solution {
public:
    bool canJump(vector& nums) {
        int l = nums.size();
      ]]></description><category></category></item><item><title><![CDATA[152. Maximum Product Subarray（最大子串积）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78985317</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78985317</guid><author>BetweenRain</author><pubDate>Fri, 05 Jan 2018 21:22:04 +0800</pubDate><description><![CDATA[这道题与最大子串和有异曲同工之妙，但是要更难一点。最大子串和只需要一直往后累加，只要不会加到比原本小就继续累加，否则替换值。但是这题要更复杂一些，因为有可能会出现偶数个负数使最后的积变得更大，但是一直往后累乘是不可能出现与负数相乘的情况（因为相乘以后比本身小的情况会被替换值）。这个时候除了维护一个局部最大值外，还需维护一个局部最小值，并且每次都比较“局部最小值*子字符”与“局部最大值”两者的大小关]]></description><category></category></item><item><title><![CDATA[115. Distinct Subsequences（互异子序列）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78985171</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78985171</guid><author>BetweenRain</author><pubDate>Fri, 05 Jan 2018 21:03:03 +0800</pubDate><description><![CDATA[这题首先要开一个二维数组来保存值，其中数组列数为匹配字符串的长度+1，而数组行数为子字符串的长度+1。根据题意也能推导出当匹配字符串与子字符串的某个字符相同时递推公式为dp[i][j]=dp[i][j-1]+dp[i-1][j-1]，否则为dp[i][j]=dp[i][j-1]。留意到当扫描匹配字符串或者子字符串的第一个字符无法使用这个递推公式，因此需要将二维数组的第一行设为1方便之后地推，之后就]]></description><category></category></item><item><title><![CDATA[120. Triangle（三角矩阵）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78985104</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78985104</guid><author>BetweenRain</author><pubDate>Fri, 05 Jan 2018 20:52:55 +0800</pubDate><description><![CDATA[这道题虽然说是三角矩阵，但是可以将它转化为一个下三角矩阵，那就跟二维数组差不多了，接下来就是按照正常的动态规划的思路了。注意到这题题意表明是从上往下找出最短路径和，但是仔细想想就知道从上往下肯定有问题。从上往下的遍历，其实相当于贪心算法，但是在这题里布恩那个保证局部最优=全局最优，因为前面的决策可能影响后面的选择，从而导致选不到更小的最小路径和。因此我的代码是从下往上进行遍历并且将当前路径和保存在]]></description><category></category></item><item><title><![CDATA[91. Decode Ways（解码方法）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78981906</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78981906</guid><author>BetweenRain</author><pubDate>Fri, 05 Jan 2018 15:30:23 +0800</pubDate><description><![CDATA[这道题的关键在于推导出递推公式，这里我将存储的数组定义为code，字符串为s，code[i]代表前i个字符可解码的数量，即code[i]代表的是s[i-1]及之前字符的总解码数量。
很明显可知code[i]的值与code[i-1]、code[i-2]都有关，当出现诸如s[i-1]='2'且s[i-2]='1'的情况时，code[i]=code[i-1]+code[i-2]，否则code[i]=c]]></description><category></category></item><item><title><![CDATA[70. Climbing Stairs（爬楼梯）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78981388</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78981388</guid><author>BetweenRain</author><pubDate>Fri, 05 Jan 2018 14:55:01 +0800</pubDate><description><![CDATA[额，感觉这是一道水题，明显可知递推公式是vec[i] = vec[i - 2] + vec[i - 1]，当然此时楼梯的级数必然大于2，至少级数为1或2的两种情况直接例外处理就好了，除此之外没有什么麻烦的地方。
class Solution {
public:
    int climbStairs(int n) {
        if (n == 1)
            return ]]></description><category></category></item><item><title><![CDATA[64. Minimum Path Sum（最短路径和）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78979788</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78979788</guid><author>BetweenRain</author><pubDate>Fri, 05 Jan 2018 12:09:45 +0800</pubDate><description><![CDATA[动态规划经典题型，很明显看得出来递推公式为:
vec[i][j] = tmp + grid[i][j](tmp = (vec[i - 1][j] > vec[i][j - 1]) ? vec[i][j - 1] : vec[i - 1][j]);
这题只需要开一个二维数组来保存当前位置的路径和即可，不过要注意一下边界值：
第一行：vec[i][j] = grid[i][j] + vec[i ]]></description><category></category></item><item><title><![CDATA[63. Unique Paths II（唯一路径之二）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78978667</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78978667</guid><author>BetweenRain</author><pubDate>Fri, 05 Jan 2018 10:58:13 +0800</pubDate><description><![CDATA[这题跟“唯一路径”有点类似，只是多了一些障碍导致通路无法连通而已，只需要判断一下在进行向下/向右走时是否存在障碍，分情况讨论即可，而且分类讨论的难度不大，也时很快就AC了。
class Solution {
public:
    int uniquePathsWithObstacles(vector>& obstacleGrid) {
        if (!obstacleGrid.siz]]></description><category></category></item><item><title><![CDATA[62. Unique Paths（唯一路径）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78978335</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78978335</guid><author>BetweenRain</author><pubDate>Fri, 05 Jan 2018 10:38:06 +0800</pubDate><description><![CDATA[动态规划的经典题，没有什么大的困难，很轻松就AC了。这里说说思路：动态规划的题目离不开递推公式，这题的递推公式很明显，就是vec[i][j] = vec[i - 1][j] + vec[i][j - 1]；除此之外，动态规划还有一个关键点就是要设置数组，来保存初始值，方便之后的递推计算。基本思路就是这些了，而写出递推公式就要通过不断做题获取经验了。

class Solution {
publ]]></description><category></category></item><item><title><![CDATA[399. Evaluate Division（除法推理）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78259360</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78259360</guid><author>BetweenRain</author><pubDate>Tue, 17 Oct 2017 13:22:37 +0800</pubDate><description><![CDATA[这道题我觉得还是有一定难度的，特别是写DFS时候调试了很久才最终解决问题（不过也有可能是我对DFS理解不深的缘故）。难点在于作出了图之后，找寻某两个数之间的数量关系必须要遍历图上所有数相互间的数量关系，这个遍历过程耗费了不少时间。降低时间复杂度的方法目前还未想出，相当于是暴力求解了。
简单说说思路：作图时我是用map>>来记录的，键是某个元素，值是这个数所对应的跟另外的数的数量关系的vector]]></description><category></category></item><item><title><![CDATA[310. Minimum Height Trees（最小高度树）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78141996</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78141996</guid><author>BetweenRain</author><pubDate>Sat, 30 Sep 2017 13:45:51 +0800</pubDate><description><![CDATA[个人认为这是一道挺难的题，本来以为是考察DFS、BFS的用法，因此一直构思如何遍历所有点并求出相应的树的高度并找出最小值，但写了很久发现还是写不出来。无奈只能上网看一下这道题的思路，才知道这题重点考察图的运用。
这道题需要先用二维向量构造出图，并不断剪去]]></description><category></category></item><item><title><![CDATA[210. Course Schedule II（课程清单之二）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78141956</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78141956</guid><author>BetweenRain</author><pubDate>Sat, 30 Sep 2017 13:40:32 +0800</pubDate><description><![CDATA[这道题没有什么好说的，因为基本解法都在上一篇博客（207. Course Schedule），这题就是多加一个vector来记录路径而已。
BFS做法：
class Solution {
public:
    vector findOrder(int numCourses, vector>& prerequisites) {
        vector> graph(numCourses,]]></description><category></category></item><item><title><![CDATA[207. Course Schedule（课程计划）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78093029</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78093029</guid><author>BetweenRain</author><pubDate>Tue, 26 Sep 2017 11:05:27 +0800</pubDate><description><![CDATA[以前做的关于图的题比较少，因此这次做这题感觉到相当的难度。虽然之后是想到了要用DFS或者BFS来解题，但是一直想用堆栈、队列来做，苦于能力不行，最后只能上网查询拓扑算法的DFS、BFS做法，并且不再纠结于一定要使用堆栈或者队列，之后便能顺利解决了。总的来说这道题价值很大，第一次对图算法有了一点理解。
关于这道题，先说说BFS做法，个人觉得更为简单。首先利用vector做出一个二维数组的graph]]></description><category></category></item><item><title><![CDATA[240. Search a 2D Matrix II（搜索二维矩阵之二）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78092342</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78092342</guid><author>BetweenRain</author><pubDate>Tue, 26 Sep 2017 10:18:22 +0800</pubDate><description><![CDATA[这道题没什么好说的，没有太大的难度，很快就AC了。简单说一下思路：观察可知越往右下数越大，加上每一行最后一个数是该行最大值，因此可以根据列值减少搜索的列数。定义 i 为矩阵的行，j 为矩阵的列，初始化 i 为0，j 为最后一列。若目标值大于当前matrix [ i ][ j ] 时，说明此行不可能比目标值大，因此 i+1；若小于，则目标值必然不在此列，因此 j-1；若等于则输出。
class S]]></description><category></category></item><item><title><![CDATA[169. Majority Element（查找多数元素）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78019126</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78019126</guid><author>BetweenRain</author><pubDate>Mon, 18 Sep 2017 14:53:40 +0800</pubDate><description><![CDATA[这题难度不大，直接用两层循环暴力求解可以AC：
class Solution {
public:
	int majorityElement(vector& nums) {
		int res = -2147483647;
		int result;
		int length = nums.size();
		for (int i = 0; i < length; i++) {
			int co]]></description><category></category></item><item><title><![CDATA[215. Kth Largest Element in an Array（找出第K大的数）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/78011620</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/78011620</guid><author>BetweenRain</author><pubDate>Sun, 17 Sep 2017 17:09:15 +0800</pubDate><description><![CDATA[既然是要找到第K大的数，那么自然想到先排好序再输出第k的位置的数了。于是就写了一个快速排序的算法：
void mySort(vector& vec, int left, int right) {
    int i = left, j = right;
    int mid = vec[(left + right) / 2];
    while (i <= j) {
        whil]]></description><category></category></item><item><title><![CDATA[53.Maximum Subarray（最大子串和）]]></title><link>https://blog.youkuaiyun.com/BetweenRain/article/details/77923055</link><guid>https://blog.youkuaiyun.com/BetweenRain/article/details/77923055</guid><author>BetweenRain</author><pubDate>Sun, 10 Sep 2017 16:45:37 +0800</pubDate><description><![CDATA[这题的难度不是很大，一开始我是直接使用暴力求解的：第一层循环选择某项作为子串的首项，第二层循环遍历其后的所有项，找出此子串的最大值，最后比较以每一项为首项的子串，找出最终的最大值。但是遇到一个大坑：一开始使用nums.size()来进行遍历，结果一直超时，之后直接用变量存着nums.size()在进行遍历就直接AC了，查过资料才知道vector.size()函数复杂度是O(n)，放在for循环中是]]></description><category></category></item></channel></rss>