<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[m0_51660741的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/m0_51660741</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; m0_51660741]]></copyright><item><title><![CDATA[【代码随想录】——回溯题目]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/125498318</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/125498318</guid><author>m0_51660741</author><pubDate>Tue, 05 Jul 2022 20:29:02 +0800</pubDate><description><![CDATA[77. 组合可以看出这个棵树，一开始集合是 1，2，3，4， 从左向右取数，取过的数，不在重复取。  可以发现n相当于树的宽度，k相当于树的深度。图中每次搜索到了叶子节点，我们就找到了一个结果。相当于只需要把达到叶子节点的结果收集起来，就可以求得 n个数中k个数的组合集合递归函数的返回值以及参数函数里一定有两个参数，既然是集合n里面取k的数，那么n和k是两个int型的参数。然后还需要一个参数，为int型变量startIndex，这个参数用来记录本层递归的中，集合从哪里开始遍历（集合就是[1,...,n] ）]]></description><category></category></item><item><title><![CDATA[【代码随想录】——回溯算法理论基础]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/125497355</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/125497355</guid><author>m0_51660741</author><pubDate>Tue, 28 Jun 2022 10:57:13 +0800</pubDate><description><![CDATA[回溯是递归的副产品，只要有递归就会有回溯。虽然回溯法很难，很不好理解，但是回溯法并不是什么高效的算法。因为回溯的本质是穷举，穷举所有可能，然后选出我们想要的答案，如果想让回溯法高效一些，可以加一些剪枝的操作，但也改不了回溯法就是穷举的本质。回溯法，一般可以解决如下几种问题： 1.回溯函数返回值以及参数回溯算法中函数返回值一般为void。再来看一下参数，因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来，所以一般是先写逻辑，然后需要什么参数，就填什么参数2.回溯函数终止条件什么时候达到了终止条]]></description><category></category></item><item><title><![CDATA[【代码随想录】——二叉搜索树相关（搜索/验证/最小绝对值差/众数/最近公共祖先/插入/删除/修剪/转化成二叉搜索树）]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/125405823</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/125405823</guid><author>m0_51660741</author><pubDate>Mon, 27 Jun 2022 10:45:21 +0800</pubDate><description><![CDATA[二叉搜索树相关（搜索/验证/最小绝对值差/众数/最近公共祖先/插入/删除/修剪/转化成二叉搜索树）]]></description><category></category></item><item><title><![CDATA[【代码随想录】——二叉树其它题目（路径总和/构造二叉树/最大二叉树/合并二叉树]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/125366843</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/125366843</guid><author>m0_51660741</author><pubDate>Wed, 22 Jun 2022 11:16:09 +0800</pubDate><description><![CDATA[112. 路径总和递归法： 1.递归的参数和返回值类型 参数：二叉树的根节点，一个计数器返回值：bool类型。找到一条符合路径的，返回即可2.终止条件不要去累加然后判断是否等于目标和，那么代码比较麻烦，可以用递减，让计数器count初始为目标和，然后每次减去遍历路径节点上的数值。如果最后count == 0，同时到了叶子节点的话，说明找到了目标和。如果遍历到了叶子节点，count不为0，就是没找到。3.单层逻辑只有非空节点才能入递归（ if(cur->left){//由于终止条件是需要判断节点是否为叶子节点]]></description><category></category></item><item><title><![CDATA[【代码随想录】——“二叉树”其他题目（二叉树的节点个数和/平衡判断/所有路径/左叶子之和）]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/125256944</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/125256944</guid><author>m0_51660741</author><pubDate>Sat, 18 Jun 2022 17:03:15 +0800</pubDate><description><![CDATA[222. 完全二叉树的节点个数层序遍历的大框架，在队列里每弹出一个节点，sum++，到最后返回sum 


110. 平衡二叉树 leetcode中强调的深度和高度很明显是按照节点来计算的。 求深度可以从上到下去查 所以需要前序遍历（中左右），而高度只能从下到上去查，所以只能后序遍历（左右中）递归法：1.明确递归函数的参数和返回值参数：当前传入节点。
返回值：以当前传入节点为根节点的树的高度。那么如何标记左右子树是否差值大于1呢？如果当前传入节点为根节点的二叉树已经不是二叉平衡树了，还返回高度的话就没有意义]]></description><category></category></item><item><title><![CDATA[【代码随想录】——“二叉树”其他题目（翻转二叉树/N叉树的前后续遍历/对称/相同二叉树/一棵树的子树]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/125234788</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/125234788</guid><author>m0_51660741</author><pubDate>Mon, 13 Jun 2022 11:26:37 +0800</pubDate><description><![CDATA[226. 翻转二叉树方法一：递归法前序遍历/后续遍历均可具体看注释 


方法二：迭代法  深度优先遍历。利用栈，入栈右左，出栈左右，符合前序遍历：根左右的顺序


层序遍历 层序遍历的大框架，每层for循环内做翻转 


589. N 叉树的前序遍历方法一：递归法 vector res;得放外面，避免每次更新res，造成数据丢失。


方法二：迭代法（使用栈） 由于迭代是使用栈，因此入栈顺序得反着来，从后面往前 





590. N 叉树的后序遍历方法一：递归法 


方法二：迭代法后续遍历...]]></description><category></category></item><item><title><![CDATA[【代码随想录】——二叉树层序遍历]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/125180525</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/125180525</guid><author>m0_51660741</author><pubDate>Fri, 10 Jun 2022 15:39:26 +0800</pubDate><description><![CDATA[之前介绍的是二叉树的深度优先遍历，接着是二叉树的另外一种遍历方式——层序遍历。层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。借用一个辅助数据结构即队列来实现，队列先进先出，符合一层一层遍历的逻辑，而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。102. 二叉树的层序遍历方法一：


方法二：相较于方法一，不同之处在于：for循环将每层填好的path放进res中之后，用path.clear()清除每层的path，就不用每一层申请一个新path。


107. 二叉树的层序遍历 II该题与上题的]]></description><category></category></item><item><title><![CDATA[【代码随想录】——二叉树的迭代遍历]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/125171961</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/125171961</guid><author>m0_51660741</author><pubDate>Wed, 08 Jun 2022 10:50:58 +0800</pubDate><description><![CDATA[递归的实现就是：每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中，然后递归返回的时候，从栈顶弹出上一次递归的各项参数，所以这就是递归为什么可以返回上一层位置的原因。144. 二叉树的前序遍历先将根节点放入栈中，然后将右孩子加入栈，再加入左孩子。 也就是：根入栈——>根出栈，右左入栈——>左右出栈，保证了前序遍历“根左右”的顺序。还得注意：空节点不入栈，得用if语句判空排除。


94. 二叉树的中序遍历 在迭代的过程中，其实我们有两个操作：前序遍历的顺序是根左右，先访问的元素是根节点，要处]]></description><category></category></item><item><title><![CDATA[【代码随想录】——“二叉树的递归遍历”]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/125169491</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/125169491</guid><author>m0_51660741</author><pubDate>Tue, 07 Jun 2022 19:27:13 +0800</pubDate><description><![CDATA[每次写递归，都按照这三要素来写确定递归函数的参数和返回值： 确定哪些参数是递归的过程中需要处理的，那么就在递归函数里加上这个参数， 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定终止条件： 写完了递归算法, 运行的时候，经常会遇到栈溢出的错误，就是没写终止条件或者终止条件写的不对，操作系统也是用一个栈的结构来保存每一层递归的信息，如果递归没有终止，操作系统的内存栈必然就会溢出。确定单层递归的逻辑： 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。 144. 二叉树]]></description><category></category></item><item><title><![CDATA[【代码随想录】——“二叉树”理论]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/125166099</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/125166099</guid><author>m0_51660741</author><pubDate>Tue, 07 Jun 2022 17:06:16 +0800</pubDate><description><![CDATA[一棵二叉树只有度为0的结点和度为2的结点，并且度为0的结点在同一层上，则这棵二叉树为满二叉树。在完全二叉树中，除了最底层节点可能没填满外，其余每层节点数都达到最大值，并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层，则该层包含 1~ 2^(h-1)  个节点。优先级队列其实是一个堆，堆就是一棵完全二叉树，同时保证父子节点的顺序关系二叉搜索树是一个有序树，是有数值的。C++中map、set、multimap，multiset的底层实现都是平衡二叉搜索树，所以map、set的增删操作时间时]]></description><category></category></item><item><title><![CDATA[【代码随想录】——“栈与队列”相关题目]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/124492346</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/124492346</guid><author>m0_51660741</author><pubDate>Tue, 07 Jun 2022 15:03:36 +0800</pubDate><description><![CDATA[20. 有效的括号

括号匹配是使用栈解决的经典问题。
]]></description><category></category></item><item><title><![CDATA[muduo学习（一）]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/124837029</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/124837029</guid><author>m0_51660741</author><pubDate>Wed, 18 May 2022 11:30:50 +0800</pubDate><description><![CDATA[大并发服务器框架设计

如何降低数据库（提高数据库的并发能力）的方法：

1、队列+连接池（DAL）

2、主要的业务逻辑挪到应用服务器处理，数据库只做辅助的业务处理

3、缓存（使用缓存的问题：缓存更新（同步））【见链接】

https://www.cnblogs.com/secondtonone1/p/7076769.htmlhttps://www.cnblogs.com/secondtonone1/p/7076769.html



分布式缓存：非关系型数据库如redis，memcatched等
..]]></description><category></category></item><item><title><![CDATA[【代码随想录】——“设计栈/队列”相关题目]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/124489968</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/124489968</guid><author>m0_51660741</author><pubDate>Fri, 29 Apr 2022 11:31:57 +0800</pubDate><description><![CDATA[232. 用栈实现队列

定义两个栈，一个输入栈，一个输出栈

push操作时，直接push操作即可

pop操作时，得考虑输出栈是否为空，如果为空，得先将输入栈的数据全部导入到输出栈，再从输出栈弹出数据;如果不为空，直接弹出数据即可。

peek操作时，也得和pop操作一样考虑。

返回数据时，得

int res=stack_out.top();
return res;

int result=stack_out.top();
stack_out.pop();
return result;

否则...]]></description><category></category></item><item><title><![CDATA[【代码随想录】字符串——“字符串”相关题目]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/124322619</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/124322619</guid><author>m0_51660741</author><pubDate>Mon, 25 Apr 2022 16:47:04 +0800</pubDate><description><![CDATA[344. 反转字符串

在206反转链表的时候，使用了“双指针”的方法，这里也是用“双指针”的方法。（超级简单）


class Solution {
public:
    void reverseString(vector&lt;char&gt;&amp; s) {
        int n=s.size();
        int left=0,right=n-1;
        while(left&lt;right){
            swap(s[left],s[right]);
]]></description><category></category></item><item><title><![CDATA[【代码随想录】哈希表——其他题目]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/124277947</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/124277947</guid><author>m0_51660741</author><pubDate>Wed, 20 Apr 2022 20:38:33 +0800</pubDate><description><![CDATA[202. 快乐数

//求和（另外定义一个函数求和）的过程中，如果sum重复出现（用哈希结构unordered_set快速判断一个元素是否重复）

//表明陷入了无限循环，直接return false;

//如果sum==1，直接返回true

//如果既不是1也没有在哈希表中出现过，将其存进哈希表（set.insert(sum)）

具体细节见注释


class Solution {
    //求和的过程中，如果sum会重复出现（用哈希结构unordered_set快速判断一个元素是否重复）
 ..]]></description><category></category></item><item><title><![CDATA[【代码随想录】哈希表——“两个数组的交集”相关题目]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/124275304</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/124275304</guid><author>m0_51660741</author><pubDate>Tue, 19 Apr 2022 16:12:22 +0800</pubDate><description><![CDATA[349. 两个数组的交集

方法一：使用哈希数据结构：unordered_set

//使用一种哈希数据结构：unordered_set ，使用unordered_set 读写效率是最高的，并不需要对数据进行排序，而且还不要让数据重复

如下图所示，将nums1存进unordered_set之后就可直接去重






class Solution {
    //使用一种哈希数据结构：unordered_set
public:
    vector&lt;int&gt; intersection(vect]]></description><category></category></item><item><title><![CDATA[【代码随想录】哈希表——“字母异位词”相关题目]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/124196770</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/124196770</guid><author>m0_51660741</author><pubDate>Mon, 18 Apr 2022 11:41:53 +0800</pubDate><description><![CDATA[哈希表能解决什么问题呢，一般哈希表都是用来快速判断一个元素是否出现集合里。

要枚举的话时间复杂度是O(n)，但如果使用哈希表的话， 只需要O(1)就可以做到。

但是哈希法也是牺牲了空间换取了时间，因为我们要使用额外的数组，set或者是map来存放数据，才能实现快速的查找



常见的三种哈希结构

当我们想使用哈希法来解决问题的时候，我们一般会选择如下三种数据结构。

数组
	set （集合）
	map(映射)
C++中，set 和 map 分别提供以下三种数据结构，其底层实现以及优劣如下表所示

集.]]></description><category></category></item><item><title><![CDATA[【代码随想录】链表——“链表”相关题目]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/124165615</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/124165615</guid><author>m0_51660741</author><pubDate>Fri, 15 Apr 2022 15:28:29 +0800</pubDate><description><![CDATA[移除一个节点之后，要养成手动清理内存的习惯。

203. 移除链表元素

设置一个虚拟头结点在进行移除节点操作


ListNode* dummy=new ListNode(0);//设置一个虚拟头结点
dummy-&gt;next=head;//将虚拟头结点指向head
ListNode* cur=dummy;//cur指针指向虚拟头结点

释放多余的节点




class Solution {
public:
    ListNode* removeElements(ListNode* head, .]]></description><category></category></item><item><title><![CDATA[【代码随想录】数组——“矩阵模拟法”相关题目]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/124152682</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/124152682</guid><author>m0_51660741</author><pubDate>Wed, 13 Apr 2022 20:23:59 +0800</pubDate><description><![CDATA[59. 螺旋矩阵 II

模拟顺时针画矩阵的过程:

填充上行从左到右
	填充右列从上到下
	填充下行从右到左
	填充左列从下到上
统一规则边界哪个闭哪个开。


class Solution {
public:
    vector&lt;vector&lt;int&gt;&gt; generateMatrix(int n) {

        vector&lt;vector&lt;int&gt;&gt; res(n,vector&lt;int&gt;(n,0));

        int lef.]]></description><category></category></item><item><title><![CDATA[【代码随想录】数组——“滑动窗口”相关题目]]></title><link>https://blog.youkuaiyun.com/m0_51660741/article/details/124132213</link><guid>https://blog.youkuaiyun.com/m0_51660741/article/details/124132213</guid><author>m0_51660741</author><pubDate>Wed, 13 Apr 2022 16:12:03 +0800</pubDate><description><![CDATA[209. 长度最小的子数组

滑动窗口，重点在于while那里动态调节窗口的大小

以及结束返回时，可能会有不符合条件的子序列，这时就需要判断最短长度是否是INT—MAX（表明没有进入while），如果是的话就返回0。


class Solution {
public:
    int minSubArrayLen(int target, vector&lt;int&gt;&amp; nums) {
        int minlen=INT_MAX;
        int i=0,sum=0;
 .]]></description><category></category></item></channel></rss>