<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[mcc6688的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/mcc6688</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; mcc6688]]></copyright><item><title><![CDATA[平衡二叉树]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109632492</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109632492</guid><author>mcc6688</author><pubDate>Wed, 11 Nov 2020 22:12:42 +0800</pubDate><description><![CDATA[平衡二叉树
题目：输入一棵二叉树的根节点，判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1，那么它就是一棵平衡二叉树。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]

返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]

返回 false 。
限制：
1 &lt;= 树的结点个数 &lt;= 10000

解题思路
构造一个获取当前子树的深度的函数 tree_height(TreeNode* root) （即二]]></description><category></category></item><item><title><![CDATA[颜色分类+移动零]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109563564</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109563564</guid><author>mcc6688</author><pubDate>Sun, 08 Nov 2020 20:06:30 +0800</pubDate><description><![CDATA[颜色分类
题目：给定一个包含红色、白色和蓝色，一共 n 个元素的数组，原地对它们进行排序，使得相同颜色的元素相邻，并按照红色、白色、蓝色顺序排列。
此题中，我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
进阶：
一个直观的解决方案是使用计数排序的两趟扫描算法。
首先，迭代计算出0、1 和 2 元素的个数，然后按照0、1、2的排序，重写当前数组。
你能想出一个仅使用常数]]></description><category></category></item><item><title><![CDATA[两数之和Ⅰ+Ⅱ]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109457616</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109457616</guid><author>mcc6688</author><pubDate>Mon, 02 Nov 2020 21:37:34 +0800</pubDate><description><![CDATA[两数之和Ⅰ
题目：给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那 两个 整数，并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是，数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解题思路
这道题可以采用哈希表来解题。我们首先定义一个unordered_map&lt;int,int&gt;hasht]]></description><category></category></item><item><title><![CDATA[连续子数组的最大和]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109368165</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109368165</guid><author>mcc6688</author><pubDate>Thu, 29 Oct 2020 20:19:49 +0800</pubDate><description><![CDATA[连续子数组的最大和
题目：输入一个整型数组，数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大，为 6。
提示：
1 &lt;= arr.length &lt;= 10^5
-100 &lt;= arr[i] &lt;= 100

解题思路
动态规划是本题的最优解法
设动态规划列表 dp ，dp[i]代表以元素 nums]]></description><category></category></item><item><title><![CDATA[合并两个有序链表]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109341706</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109341706</guid><author>mcc6688</author><pubDate>Wed, 28 Oct 2020 20:12:55 +0800</pubDate><description><![CDATA[合并两个有序链表
题目：将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例：
输入：1-&gt;2-&gt;4, 1-&gt;3-&gt;4
输出：1-&gt;1-&gt;2-&gt;3-&gt;4-&gt;4

解题思路



首先我们先定义一个哑节点dum；


当链表l1、l2不为空时，我们判断
若l1-&gt;val&lt; l2-&gt;val：
pre-&gt;next=l1;
l1=l1-&gt;next;
否则：
pre-&gt;next=]]></description><category></category></item><item><title><![CDATA[环形链表Ⅰ+Ⅱ]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109319762</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109319762</guid><author>mcc6688</author><pubDate>Tue, 27 Oct 2020 20:52:27 +0800</pubDate><description><![CDATA[环形链表Ⅰ
题目：给定一个链表，判断链表中是否有环。
如果链表中有某个节点，可以通过连续跟踪 next 指针再次到达，则链表中存在环。 为了表示给定链表中的环，我们使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。 如果 pos 是 -1，则在该链表中没有环。**注意：pos 不作为参数进行传递，仅仅是为了标识链表的实际情况。**如果链表中存在环，则返回 true 。 否则，返回 false 。
进阶：
你能用 O(1)（即，常量）内存解决此问题吗？
示例 1：

输入：head = []]></description><category></category></item><item><title><![CDATA[反转链表Ⅰ+Ⅱ]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109298879</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109298879</guid><author>mcc6688</author><pubDate>Mon, 26 Oct 2020 22:09:12 +0800</pubDate><description><![CDATA[反转链表Ⅰ
题目：定义一个函数，输入一个链表的头节点，反转该链表并输出反转后链表的头节点。
示例:
输入: 1-&gt;2-&gt;3-&gt;4-&gt;5-&gt;NULL
输出: 5-&gt;4-&gt;3-&gt;2-&gt;1-&gt;NULL
限制：
0 &lt;= 节点个数 &lt;= 5000

解题思路（双指针法）


提定义两个指针： pre 和 cur ；pre 在前 cur 在后。
每次让 pre 的 next 指向 cur ，实现一次局部反转
局部反转完成之后， pre 和 cur]]></description><category></category></item><item><title><![CDATA[删除排序链表中的重复元素Ⅰ+Ⅱ]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109280549</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109280549</guid><author>mcc6688</author><pubDate>Sun, 25 Oct 2020 23:04:02 +0800</pubDate><description><![CDATA[删除排序链表中的重复元素Ⅰ
题目：给定一个排序链表，删除所有重复的元素，使得每个元素只出现一次。
示例 1:
输入: 1-&gt;1-&gt;2
输出: 1-&gt;2
示例 2:
输入: 1-&gt;1-&gt;2-&gt;3-&gt;3
输出: 1-&gt;2-&gt;3

解题思路
我们可以通过将结点的值与它之后的结点进行比较来确定它是否为重复结点。如果它是重复的，我们更改当前结点的 next 指针，以便它跳过下一个结点并直接指向下一个结点之后的结点。
代码展示
代码如下：
class Solutio]]></description><category></category></item><item><title><![CDATA[0~n-1中缺失的数字]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109229461</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109229461</guid><author>mcc6688</author><pubDate>Thu, 22 Oct 2020 20:13:02 +0800</pubDate><description><![CDATA[0~n-1中缺失的数字
题目：一个长度为n-1的递增排序数组中的所有数字都是唯一的，并且每个数字都在范围0～n-1之内。在范围0～n-1内的n个数字中有且只有一个数字不在该数组中，请找出这个数字。
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
限制：
1 &lt;= 数组长度 &lt;= 10000

解题思路
排序数组中的搜索问题，首先想到 二分法 解决。
根据题意可知，数组是排序数组，所以我们可以先判断数组中间的值是否与其下标索引]]></description><category></category></item><item><title><![CDATA[两个链表的第一个公共节点]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109208712</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109208712</guid><author>mcc6688</author><pubDate>Wed, 21 Oct 2020 20:16:52 +0800</pubDate><description><![CDATA[两个链表的第一个公共节点
题目：输入两个链表，找出它们的第一个公共节点。
如下面的两个链表：

在节点 c1 开始相交。
示例 1：

输入：intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出：Reference of the node with value = 8
输入解释：相交节点的值为 8 （注意，如果两个列表相交则不能为 0）。从各自的表头开始算起，链表 A 为 [4,1,8,4,]]></description><category></category></item><item><title><![CDATA[三角形最小路径和]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109190944</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109190944</guid><author>mcc6688</author><pubDate>Tue, 20 Oct 2020 22:28:32 +0800</pubDate><description><![CDATA[三角形最小路径和
题目：给定一个三角形，找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。
例如，给定三角形：
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11（即，2 + 3 + 5 + 1 = 11）。

解题思路
一般遇到这类最优问题我们通常会想到动态规划的方法。
首先这题我们可以把二维数组看成一个直角三角形。我们先创建一个与原数组tr]]></description><category></category></item><item><title><![CDATA[三个数最大的乘积]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109169623</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109169623</guid><author>mcc6688</author><pubDate>Mon, 19 Oct 2020 21:40:37 +0800</pubDate><description><![CDATA[三个数最大的乘积
题目：给定一个整型数组，在数组中找出由三个数组成的最大乘积，并输出这个乘积。
示例 1:
输入: [1,2,3]
输出: 6
示例 2:
输入: [1,2,3,4]
输出: 24
注意:
给定的整型数组长度范围是[3,10^4]，数组中所有的元素范围是[-1000, 1000]。
输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。

解题思路
题目给定的整型数组长度范围是[3,10^4]，数组中所有的元素范围是[-1000, 1000]，所以我们先对其进行排序。排完序后分两种情况]]></description><category></category></item><item><title><![CDATA[所有奇数长度子数组的和]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109167896</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109167896</guid><author>mcc6688</author><pubDate>Mon, 19 Oct 2020 20:32:31 +0800</pubDate><description><![CDATA[所有奇数长度子数组的和
题目：给你一个正整数数组 arr ，请你计算所有可能的奇数长度子数组的和。
子数组 定义为原数组中的一个连续子序列。
请你返回 arr 中 所有奇数长度子数组的和 。
示例 1：
输入：arr = [1,4,2,5,3]
输出：58
解释：所有奇数长度子数组和它们的和为：
[1] = 1
[4] = 4
[2] = 2
[5] = 5
[3] = 3
[1,4,2] = 7
[4,2,5] = 11
[2,5,3] = 10
[1,4,2,5,3] = 15
我们将所有值求和得到 1]]></description><category></category></item><item><title><![CDATA[主要元素+有序数组的平方]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109151177</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109151177</guid><author>mcc6688</author><pubDate>Sun, 18 Oct 2020 22:43:55 +0800</pubDate><description><![CDATA[主要元素
题目：数组中占比超过一半的元素称之为主要元素。给定一个整数数组，找到它的主要元素。若没有，返回-1。
示例 1：
输入：[1,2,5,9,5,9,5,5,5]
输出：5
示例 2：
输入：[3,2]
输出：-1
示例 3：
输入：[2,2,1,1,1,2,2]
输出：2
说明：
你有办法在时间复杂度为 O(N)，空间复杂度为 O(1) 内完成吗？

解题思路
我们要找到的主要元素是数组中占比超过一半的元素。因此可以先将数组中的元素排序，如果存在主要元素，那么排序后的中间元素一定是主要元素，然后通过]]></description><category></category></item><item><title><![CDATA[转置矩阵]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109126378</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109126378</guid><author>mcc6688</author><pubDate>Fri, 16 Oct 2020 23:06:48 +0800</pubDate><description><![CDATA[转置矩阵
题目：给定一个矩阵 A， 返回 A 的转置矩阵。
矩阵的转置是指将矩阵的主对角线翻转，交换矩阵的行索引与列索引。
示例 1：
输入：[[1,2,3],[4,5,6],[7,8,9]]
输出：[[1,4,7],[2,5,8],[3,6,9]]
示例 2：
输入：[[1,2,3],[4,5,6]]
输出：[[1,4],[2,5],[3,6]]
提示：
1 &lt;= A.length &lt;= 1000
1 &lt;= A[0].length &lt;= 1000

解题思路
1）获取原数组行列
2]]></description><category></category></item><item><title><![CDATA[字符串的排列（C++中等区）]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109045716</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109045716</guid><author>mcc6688</author><pubDate>Tue, 13 Oct 2020 10:17:28 +0800</pubDate><description><![CDATA[字符串的排列
题目：输入一个字符串，打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组，但里面不能有重复元素。
 示例:
输入：s = “abc”
输出：[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
限制：
1 &lt;= s 的长度 &lt;= 8

解题思路
回溯法
回溯六步走
①画出递归树，找到状态变量(回溯函数的参数)，这一步非常重要
②根据题意，确立结束条件
③找准选择列表(与函数参数相关),与第一步紧密关联
④判断是否需要剪枝
⑤作出选择，递归调用]]></description><category></category></item><item><title><![CDATA[二叉搜索树与双向链表（C++中等区）]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/109008409</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/109008409</guid><author>mcc6688</author><pubDate>Sun, 11 Oct 2020 10:23:37 +0800</pubDate><description><![CDATA[二叉搜索树与双向链表
题目：输入一棵二叉搜索树，将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点，只能调整树中节点指针的指向。
为了让您更好地理解问题，以下面的二叉搜索树为例：

我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表，第一个节点的前驱是最后一个节点，最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。

特别地，我们希望可以就地完成转换操作。当转化完成以后，]]></description><category></category></item><item><title><![CDATA[复杂链表的复制（C++中等区）]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/108974147</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/108974147</guid><author>mcc6688</author><pubDate>Fri, 09 Oct 2020 10:40:39 +0800</pubDate><description><![CDATA[复杂链表的复制
题目：请实现 copyRandomList 函数，复制一个复杂链表。在复杂链表中，每个节点除了有一个 next 指针指向下一个节点，还有一个 random 指针指向链表中的任意节点或者 null。
示例 1：
输入：head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出：[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2：

输入：head = [[1,1],[2,1]]
输出：[[1,1],[2,1]]
示例 3：
]]></description><category></category></item><item><title><![CDATA[二叉树中和为某一值的路径（C++中等区）]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/108959718</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/108959718</guid><author>mcc6688</author><pubDate>Thu, 08 Oct 2020 09:57:12 +0800</pubDate><description><![CDATA[二叉树中和为某一值的路径
题目：输入一棵二叉树和一个整数，打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树，以及目标和 sum = 22，

返回:

提示：
节点总数 &lt;= 10000

解题思路
采用前序遍历 + 递归回溯来解题
先序遍历： 按照 “根、左、右” 的顺序，遍历树的所有节点。
路径记录： 在先序遍历中，记录从根节点到当前节点的路径。当从根节点到叶节点形成的路径各节点值的和等于目标值 sum 时，将此路径加]]></description><category></category></item><item><title><![CDATA[二叉搜索树的后序遍历序列（C++中等）]]></title><link>https://blog.youkuaiyun.com/mcc6688/article/details/108947514</link><guid>https://blog.youkuaiyun.com/mcc6688/article/details/108947514</guid><author>mcc6688</author><pubDate>Wed, 07 Oct 2020 10:42:17 +0800</pubDate><description><![CDATA[二叉搜索树的后序遍历序列
题目：输入一个整数数组，判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true，否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树：

示例 1：
输入: [1,6,3,2,5]
输出: false
示例 2：
输入: [1,3,2,6,5]
输出: true
提示：
数组长度 &lt;= 1000

解题思路
如果这题说的是判断该数组是不是某二叉搜索树的中序遍历结果，那么这道题就非常简单了，因为二叉搜索树的中序遍历结果一定是有序的，]]></description><category></category></item></channel></rss>