<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[D_4_Y_的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/D_4_Y_</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; D_4_Y_]]></copyright><item><title><![CDATA[最长递增子序列]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/99206960</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/99206960</guid><author>D_4_Y_</author><pubDate>Sun, 11 Aug 2019 17:27:38 +0800</pubDate><description><![CDATA[一.最长连续递增子序列
Q：输入一个数组，求数组中连续递增子序列的最大长度
输入：5 ,{1,3,4,2,7}
输出：3  （最长递增子序列为{1，3，4})
解题思路：

题目要求子序列连续，可以从起始位置开始一直向后判断，如果后一个位置大于该位置，则继续向后判断并记录长度；
如果出现后一个位置小于前一个位置，那么就不必再向后判断，此时的长度就是以该起始位置开始的连续递增子序列的长度；
将长度与...]]></description><category></category></item><item><title><![CDATA[单链表排序]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/98594946</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/98594946</guid><author>D_4_Y_</author><pubDate>Tue, 06 Aug 2019 11:05:54 +0800</pubDate><description><![CDATA[Q：给出单链表L：L 0→L 1→…→L n-1→L n， 将其重新排序为：L 0→L n→L 1→L n-1→L 2→L n-2→…
例如：1-&gt;4-&gt;2-&gt;3-&gt;5-&gt;9
排序后：1-&gt;9-&gt;4-&gt;5-&gt;2-&gt;3
解题思路：

从题意我们可以发现，排序是按照一首一尾、一首一尾来进行
我们可以先找到中间节点，将链表分割为两个部分；再将后...]]></description><category></category></item><item><title><![CDATA[链表排序（归并+递归）]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/98592228</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/98592228</guid><author>D_4_Y_</author><pubDate>Tue, 06 Aug 2019 10:36:11 +0800</pubDate><description><![CDATA[Q:使用常量空间复杂度在O（n log n）时间内对链表进行排序。
解题思路：

题目要求时间复杂度最大为O（n*logn),因此我们考虑使用归并排序思想进行排序
找到链表中间位置，将链表切成左右两部分；再找到左右两部分的中间位置将链表切断；直到左右部分的链表不能再切分为止；
从下至上递归对切好的链表进行排序，即先让子链表有序，再依次向上让子链表间有序，最后使整个链表有序（二路归并）

代码实现：...]]></description><category></category></item><item><title><![CDATA[归并排序]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/98510775</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/98510775</guid><author>D_4_Y_</author><pubDate>Mon, 05 Aug 2019 20:11:43 +0800</pubDate><description><![CDATA[一.基本思想
归并排序是建立在归并操作上的一个有效排序算法，该算法是分治法的典型应用。将已有的子序列合并，得到完全有序的序列；即先使每个子序列有序，再使子序列段间有序；如果将两个子序列合并成一个序列，称为二路归并。
二.图解算法步骤

排序步骤：

递归找到序列的中间位置，将序列分为两部分，直到不能再继续分为止
递归排序分成的两部分；具体可以开一个辅助空间，空间大小为要排序的节点个数，对辅助空间进...]]></description><category></category></item><item><title><![CDATA[最长公共子串（动态规划）]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/98480945</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/98480945</guid><author>D_4_Y_</author><pubDate>Mon, 05 Aug 2019 11:33:55 +0800</pubDate><description><![CDATA[Q：给定两个字符串，输出两个字符串的最长公共子串及长度，如果没有公共子串则输出0
输入：
asd12asf
abd1asfba
输出：
3
asf
解题思路：

首先理解清楚最长公共子串和最长公共子序列的区别；最长公共子串要求子串是要连续的，而公共子序列不要求连续
建立二维数组，保存到该位置已经有几个字符串连续相等，初始化为0
如果s1[i]==s2[j],那么v[i][j]=v[i-1][j-1...]]></description><category></category></item><item><title><![CDATA[走迷宫（广度优先搜索）]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/97641499</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/97641499</guid><author>D_4_Y_</author><pubDate>Mon, 29 Jul 2019 15:19:40 +0800</pubDate><description><![CDATA[Q:给出一个迷宫地图，计算最快走出迷宫需要多少步？
输入：
每组数据是10*10，由‘#’和‘.’组成的迷宫，其中‘#’代表墙，‘.'代表通路；
入口在第一行第二列，出口在最后一行第九列；
从任意一个‘.’都能一步走到上下左右的‘.’；
输出：
每组数据，输出从入口到出口最短需要多少步

解题思路：

因为要求出最短路径，因此我们很容易想到利用广度优先搜索来计算路径
广度优先搜索（BFS）：利用队...]]></description><category></category></item><item><title><![CDATA[最长回文子串（动态规划）]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/97406897</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/97406897</guid><author>D_4_Y_</author><pubDate>Fri, 26 Jul 2019 19:31:33 +0800</pubDate><description><![CDATA[Q：给定一个字符串s,找到s中最长的回文字串
解决思路：

动态规划，建立一个数组dp,用dp[l][r]表示s[l,r]是不是一个回文串，如果是则为true,不是就是false
s[l,r]代表字符串从下标为l到下标为r的子串，如果s[l,r]是一个回文串，那么s[l+1][r-1]也是一个回文串；也就是说如果dp[l][r]=true,那么dp[l+1][r-1]也为true
如果字符串只有1...]]></description><category></category></item><item><title><![CDATA[二叉树的下一个节点]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/96747329</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/96747329</guid><author>D_4_Y_</author><pubDate>Sun, 21 Jul 2019 19:25:49 +0800</pubDate><description><![CDATA[Q:给定一个二叉树和其中一个节点，请找出中序遍历顺序的下一个节点并且返回；注意：树中的节点不仅包含左右子节点，同时包含指向父节点的指针。
解题思路：

要找出中序遍历顺序的下一个节点，则要首先搞清楚中序遍历的顺序，即先遍历左子树再遍历根节点再遍历右子树
要找出下一个节点，分为下面几种情况：
情况一：给定节点有右孩子，那么下一个节点则为它的右子树的最左节点（不论该节点是否是根节点，都是一样的）
情况...]]></description><category></category></item><item><title><![CDATA[圆圈中最后剩下的数]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/96722993</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/96722993</guid><author>D_4_Y_</author><pubDate>Sun, 21 Jul 2019 16:02:12 +0800</pubDate><description><![CDATA[Q:0~n-1这n个数字围成一个圆圈，每次删除圈内的第m个数字，求圆圈内最后一个剩下的数字
解法一：list容器+迭代器
解题思路：

因为要每次删除一个数字，并且要遍历，因此需要找到一个方便遍历并且删除效率高的容器；这里我们使用list容器，因为它的删除效率高并且支持迭代器，我们用list模拟环
首先将n个数字尾插进list中
再使用迭代器开始遍历，每次从当前位置走m-1步就到达第m个数字，如果...]]></description><category></category></item><item><title><![CDATA[和为S的两个数字]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/96595980</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/96595980</guid><author>D_4_Y_</author><pubDate>Sat, 20 Jul 2019 16:03:32 +0800</pubDate><description><![CDATA[Q：输入一个递增序列的数组和一个数字S，在数组中查找两个数，使得他们的和正好是S，如果有多对数字的和为S，输出两个数的乘积最小的
解题思路:

查找两个数和为S，没有要求数字连续，因此我们可以采用“首尾指针法”
第一个指针指向数组第一个元素，另一个指针指向数组最后一个元素，当它们的和大于S时证明和大了，因此要将尾指针左移减小和的大小；当和小于S时证明和小了，因此要将首指针右移增大和；
最后要考虑的...]]></description><category></category></item><item><title><![CDATA[数组中只出现一次的数字]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/96495642</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/96495642</guid><author>D_4_Y_</author><pubDate>Fri, 19 Jul 2019 19:57:37 +0800</pubDate><description><![CDATA[Q：一个整型数组里只有两个数字只出现一次，其他数字都出现了两次，请找出这两个只出现一次的数字
解题思路：

通过异或相关知识我们可以知道，成对出现的数字异或后结果为0，那么将这组数据一次异或后的结果就是只出现一次的两个数字异或的结果
观察异或结果，比特位为1的就是只出现一次的两个数字比特位不同的位，通过移位并与1结果可以找到第一个比特位不同的位
根据该比特位是否为1，可以将这组数据分为两组，成对出...]]></description><category></category></item><item><title><![CDATA[右值引用（移动构造+移动赋值）]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/95228609</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/95228609</guid><author>D_4_Y_</author><pubDate>Tue, 09 Jul 2019 22:55:09 +0800</pubDate><description><![CDATA[一、概念
在学习本节的时候，常常会因字面意思而导致错误认知，因此我们首先来理清一些概念

左值：一般来讲在等号左边的都是左值，是可以被修改的值
右值：在等号右边的值不一定是右值！！！右值是不可以被改变的值，例如常量、临时对象、表达式返回值等
左值引用：例如int&amp; lr=a；优点：在传值和传参的位置时使用，可以减少拷贝次数，提高运行效率
右值引用：例如int&amp;&amp; rr=a;...]]></description><category></category></item><item><title><![CDATA[析构函数定义为虚函数]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/94841744</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/94841744</guid><author>D_4_Y_</author><pubDate>Sat, 06 Jul 2019 12:12:46 +0800</pubDate><description><![CDATA[Q：析构函数为什么要定义为虚函数？
1.我们在之前的学习中都知道，在调用构造函数时先调用基类的构造函数，再调用派生类构造函数；而当调用析构函数时，则要先调用派生类的析构函数再调用基类的析构函数
#include&lt;iostream&gt;
using namespace std;
class A{
public:
	A(){
		cout &lt;&lt; "A()" &lt;&lt; end...]]></description><category></category></item><item><title><![CDATA[整数中1出现的次数]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/93894125</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/93894125</guid><author>D_4_Y_</author><pubDate>Thu, 27 Jun 2019 18:35:26 +0800</pubDate><description><![CDATA[Q：求任意非负整数区间中1出现的次数（从1到n中1出现的次数）
例如：
1-20之间1出现的次数为：1，10，11，12，13，14，15，16，17，18，19共12次
思路：
假如给定一个数字为abcde,c为百位的数字，那么要计算百位出现1的次数，我们会发现有三种不同的情况：

如果百位数字为0，则百位出现1的次数由它的高位数字决定。例如12012，百位可能出现1的情况有100–199,11...]]></description><category></category></item><item><title><![CDATA[连续子数组的最大和]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/93392544</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/93392544</guid><author>D_4_Y_</author><pubDate>Sun, 23 Jun 2019 18:07:51 +0800</pubDate><description><![CDATA[Q：给一个数组，返回它的最大连续子数组和
例如：
输入：{6，-2，-3，8，-15}
返回：9
方法一：
思路：

使用动态规划
用sum记录当前子数组的和，res记录最大子数组的和
如果sum+当前元素的值小于当前元素本身值，证明之前的子数组和对该元素没有贡献，所以从该元素开始重新记录，如果大于当前元素值则证明有贡献，继续向后记录
res是当前子数组和与之前记录的最大值中较大的

画图：

代...]]></description><category></category></item><item><title><![CDATA[字符串的排列（递归）]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/93390270</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/93390270</guid><author>D_4_Y_</author><pubDate>Sun, 23 Jun 2019 17:42:38 +0800</pubDate><description><![CDATA[Q：输入一个字符串，按字典序打印出该字符串中字符的所有排列，例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba
思路：

把一个字符串可以分为两个部分，第一部分为字符串的首字符，第二部分为剩下的字符串
要求字符的全排列，就是把一个位置的字符依次与后面每个位置的字符进行交换得到新的字符串
首先固定第一个字符，求后面所有字符的全排列；而...]]></description><category></category></item><item><title><![CDATA[复杂链表的复制（三步法）]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/93136247</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/93136247</guid><author>D_4_Y_</author><pubDate>Fri, 21 Jun 2019 16:35:59 +0800</pubDate><description><![CDATA[Q:输入一个复杂链表（每个节点中有节点值，以及两个指针，一个指向下一个节点，另一个特殊指针指向任意一个节点），返回结果为复制后复杂链表的head(注意：输出结果中不要返回参数中的节点引用，否则判题程序会直接返回空）
思路：

首先，复制节点并插入在该节点后面
还原原节点的特殊指针指向
拆分原链表和新链表


...]]></description><category></category></item><item><title><![CDATA[二叉搜索树与双向链表（递归）]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/93131340</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/93131340</guid><author>D_4_Y_</author><pubDate>Thu, 20 Jun 2019 20:58:13 +0800</pubDate><description><![CDATA[Q：输入一棵二叉搜索树，将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点，只能调整树中结点指针的指向。
思路：

二叉搜索树本身就是一棵有序的树，要转换成一个排序的链表，则就是它的中序遍历，遍历的第一个结点是最左结点
定义一个prev指针保存它的前一个结点，调整指针指向

画图：
|  
代码：
定义树的结点：
struct TreeNode {
	int val;
	struct...]]></description><category></category></item><item><title><![CDATA[合并两个有序链表]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/92836595</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/92836595</guid><author>D_4_Y_</author><pubDate>Wed, 19 Jun 2019 16:41:01 +0800</pubDate><description><![CDATA[Q:输入两个单调递增的链表，输出两个链表合成后的链表，使合成后的链表也满足单调递增
输入：
A：2-&gt;4-&gt;6-&gt;7-&gt;10
B：1-&gt;2-&gt;3-&gt;8-&gt;9
输出：
1-&gt;2-&gt;2-&gt;3-&gt;4-&gt;6-&gt;7-&gt;8-&gt;9-&gt;10
代码：
定义链表节点：
struct ListNode {
	int v...]]></description><category></category></item><item><title><![CDATA[判断一个树是否是另一个树的子结构]]></title><link>https://blog.youkuaiyun.com/D_4_Y_/article/details/92835301</link><guid>https://blog.youkuaiyun.com/D_4_Y_/article/details/92835301</guid><author>D_4_Y_</author><pubDate>Wed, 19 Jun 2019 16:15:31 +0800</pubDate><description><![CDATA[Q：给定一个树A和树B，判断树B是否是树A的子结构（约定空树不是任何一个树的子结构）
解题思路：

用递归的思想
如果根节点相同，则继续判断左右节点是否相同
如过根节点不同，则递归判断左右节点及其子树

代码：
定义树的节点：
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode...]]></description><category></category></item></channel></rss>