<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[fujch3的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/fujch3</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; fujch3]]></copyright><item><title><![CDATA[不相交的握手]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106440526</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106440526</guid><author>fujch3</author><pubDate>Sat, 30 May 2020 13:56:18 +0800</pubDate><description><![CDATA[【题目描述】

偶数 个人站成一个圆，总人数为 num_people 。每个人与除自己外的一个人握手，所以总共会有 num_people / 2 次握手。
将握手的人之间连线，请你返回连线不会相交的握手方案数。
由于结果可能会很大，请你返回答案 模 10^9+7 后的结果。

【示例】

输入：num_people = 2
输出：1

输入：num_people = 4
输出：2
解释：总共有两种方案，第一种方案是 [(1,2),(3,4)] ，第二种方案是 [(2,3),(4,1)] 。


输入：num]]></description><category></category></item><item><title><![CDATA[无重复数字的数组全排列]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106428229</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106428229</guid><author>fujch3</author><pubDate>Fri, 29 May 2020 16:36:25 +0800</pubDate><description><![CDATA[【题目描述】

给定一个 没有重复 数字的序列，返回其所有可能的全排列。

【示例】

输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

【代码】
class Solution {
public:
    void perm(vector&lt;vector&lt;int&gt; &gt; &amp;res, vector&lt;int&gt;&amp; nums, int start, int end)
  ]]></description><category></category></item><item><title><![CDATA[数组的子集（全排列）]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106427011</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106427011</guid><author>fujch3</author><pubDate>Fri, 29 May 2020 16:04:07 +0800</pubDate><description><![CDATA[【题目描述】

给定一组不含重复元素的整数数组 nums，返回该数组所有可能的子集（幂集）。
说明：解集不能包含重复的子集。

【示例】

输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

【解题思路】
这道题利用递归，每次固定一个数，然后保存，再继续遍历下去
【代码】
class Solution {
public:
    void DFS(vector&lt;vector&lt;int&gt;&gt;]]></description><category></category></item><item><title><![CDATA[组成最大数]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106412801</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106412801</guid><author>fujch3</author><pubDate>Thu, 28 May 2020 20:34:09 +0800</pubDate><description><![CDATA[【题目描述】

给定一组非负整数，重新排列它们的顺序使之组成一个最大的整数。

【示例】

输入: [10,2]
输出: 210
输入: [3,30,34,5,9]
输出: 9534330

【解题思路】
自定义一种排序比较方法，就是判断ab&gt;ba
注意如果数组全是0，输出为“0”
【代码】
class Solution {
public:
    static bool comp(const string a, const string b)
    {
        string sum1 = ]]></description><category></category></item><item><title><![CDATA[数组的度]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106411384</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106411384</guid><author>fujch3</author><pubDate>Thu, 28 May 2020 19:09:15 +0800</pubDate><description><![CDATA[【题目描述】

给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。
你的任务是找到与 nums 拥有相同大小的度的最短连续子数组，返回其长度。

【示例】

输入: [1, 2, 2, 3, 1]
输出: 2
解释:
输入数组的度是2，因为元素1和2的出现频数最大，均为2.
连续子数组里面拥有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]]]></description><category></category></item><item><title><![CDATA[四数之和为target(2)]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106410714</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106410714</guid><author>fujch3</author><pubDate>Thu, 28 May 2020 18:23:39 +0800</pubDate><description><![CDATA[【题目描述】

给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ，使得 A[i] + B[j] + C[k] + D[l] = 0。
为了使问题简单化，所有的 A, B, C, D 具有相同的长度 N，且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间，最终结果不会超过 231 - 1 。

【示例】

输入:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]
输出:
2
解释]]></description><category></category></item><item><title><![CDATA[四数之和为target]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106408353</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106408353</guid><author>fujch3</author><pubDate>Thu, 28 May 2020 16:46:52 +0800</pubDate><description><![CDATA[【题目描述】

给定一个包含 n 个整数的数组 nums 和一个目标值 target，判断 nums 中是否存在四个元素 a，b，c 和 d ，使得 a + b + c + d 的值与 target 相等？找出所有满足条件且不重复的四元组。
注意：答案中不可以包含重复的四元组。

【示例】

给定数组 nums = [1, 0, -1, 0, -2, 2]，和 target = 0。
满足要求的四元组集合为：
[
[-1,  0, 0, 1],
[-2, -1, 1, 2],
[-2,  0, 0, 2]
]]></description><category></category></item><item><title><![CDATA[三数之和为0]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106407508</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106407508</guid><author>fujch3</author><pubDate>Thu, 28 May 2020 16:29:12 +0800</pubDate><description><![CDATA[【题目描述】

给你一个包含 n 个整数的数组 nums，判断 nums 中是否存在三个元素 a，b，c ，使得 a + b + c = 0 ？请你找出所有满足条件且不重复的三元组。
注意：答案中不可以包含重复的三元组。

【示例】

给定数组 nums = [-1, 0, 1, 2, -1, -4]，
满足要求的三元组集合为：
[
[-1, 0, 1],
[-1, -1, 2]
]

【解题思路】
1.暴力解法，就是我们用三个循环嵌套，然后找出和为0的三个数，但是这种情况下很耗时，时间复杂度为O(n^3)]]></description><category></category></item><item><title><![CDATA[平衡二叉树]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106108448</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106108448</guid><author>fujch3</author><pubDate>Thu, 14 May 2020 15:15:30 +0800</pubDate><description><![CDATA[【题目描述】
输入一棵二叉树，判断该二叉树是否是平衡二叉树。
在这里，我们只需要考虑其平衡性，不需要考虑其是不是排序二叉树
【代码】
    int depth(TreeNode* pRoot)
    {
        if(!pRoot) return 0;
        int l = depth(pRoot-&gt;left);
        if(l == -1) return -1;
        int r = depth(pRoot-&gt;right);
        if(r ]]></description><category></category></item><item><title><![CDATA[求1+2+...+n]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106107834</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106107834</guid><author>fujch3</author><pubDate>Wed, 13 May 2020 21:59:33 +0800</pubDate><description><![CDATA[【题目描述】
求1+2+3+…+n，要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句（A?B:C）。
【思路】
利用构造函数和静态变量及函数
【代码】
class Father
{
public:
    Father()
    {
        n++;
        sum += n; 
    }
    static void clear()
    {
        n = 0;
        sum = 0;
    }
    
 ]]></description><category></category></item><item><title><![CDATA[数据流中的中位数]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106107166</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106107166</guid><author>fujch3</author><pubDate>Wed, 13 May 2020 21:31:08 +0800</pubDate><description><![CDATA[【题目描述】
如何得到一个数据流中的中位数？如果从数据流中读出奇数个数值，那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值，那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流，使用GetMedian()方法获取当前读取数据的中位数。
【思路】
使用大小堆，用优先队列来保存大小两个部分数据
【代码】
class Solution {
public:
    void Insert(int num)
    {
        if(small.s]]></description><category></category></item><item><title><![CDATA[二叉树分层打印]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106106901</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106106901</guid><author>fujch3</author><pubDate>Wed, 13 May 2020 21:15:05 +0800</pubDate><description><![CDATA[【题目描述】
从上到下按层打印二叉树，同一层结点从左至右输出。每一层输出一行。
【思路】
先求二叉树深度，然后按照先序遍历来打印
【代码】
void depth(vector&lt;vector&lt;int&gt;&gt;&amp;vec, TreeNode* root, int h)
        {
            if(!root) return;
            vec[h].push_back(root-&gt;val);
            depth(vec,root-]]></description><category></category></item><item><title><![CDATA[二叉树的下一个结点]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106106454</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106106454</guid><author>fujch3</author><pubDate>Wed, 13 May 2020 20:56:52 +0800</pubDate><description><![CDATA[【题目描述】
给定一个二叉树和其中的一个结点，请找出中序遍历顺序的下一个结点并且返回。注意，树中的结点不仅包含左右子结点，同时包含指向父结点的指针。
【思路】
考虑以下情况：
1.如果结点有右子树，那么它的下一个结点就是右子树的最左结点
2.如果结点没有右子树：
（1）如果结点是其父节点的左子树，那么它的下一个结点就是其父节点
（2）如果结点是其父节点的右子树，那么就向上一直遍历，直到它是父节点的左子节点的节点，那么这个节点的父节点就是我们需要的
【代码】
 TreeLinkNode* GetNext(Tr]]></description><category></category></item><item><title><![CDATA[链表中环的入口]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106105874</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106105874</guid><author>fujch3</author><pubDate>Wed, 13 May 2020 20:28:51 +0800</pubDate><description><![CDATA[【题目描述】
给一个链表，若其中包含环，请找出该链表的环的入口结点，否则，输出null。
【思路】
之前我们判断链表是否有环，用两个指针，快慢指针，一个走一步，一个走两步，在此基础上，当两个指针相遇，此时肯定在环中，那么接着计算环的节点数，就利用相遇节点往前走，直到在次回到相遇点，即可计算环的节点数n，然后利用两个指针同时指向头节点，第一个指针先向前走n个节点，然后两个指针同时向前走，直到两者相遇即为环入口。
【代码】
ListNode* Meet(ListNode* pHead)
    {
      ]]></description><category></category></item><item><title><![CDATA[判断字符串是否表示数值]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106103728</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106103728</guid><author>fujch3</author><pubDate>Wed, 13 May 2020 18:14:10 +0800</pubDate><description><![CDATA[【题目描述】
请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。例如，字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
【思路】
找到通用规律A.B[[E|e]C], A.B表示整数加小数,C表示指数，ABC可能为带符号数，然后具体判断看代码
【代码】
	//判断数字
    bool isUnsignedInt(char** str)
    {
        i]]></description><category></category></item><item><title><![CDATA[找到数组中任意一个重复数字]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106101710</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106101710</guid><author>fujch3</author><pubDate>Wed, 13 May 2020 17:05:30 +0800</pubDate><description><![CDATA[【题目描述】
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的，但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如，如果输入长度为7的数组{2,3,1,0,2,5,3}，那么对应的输出是第一个重复的数字2。
【思路】
暴力法：每个数字与之后的数字对比，直到找到重复数字
查找表：用额外空间保存数组每个元素出现的次数，出现次数大于1，即为重复数，时间复杂度O(n),空间复杂度O(n);
置换法：重头扫描数组，遇到下标为i的数字如果不是i的]]></description><category></category></item><item><title><![CDATA[变态跳台阶]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106101201</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106101201</guid><author>fujch3</author><pubDate>Wed, 13 May 2020 16:33:41 +0800</pubDate><description><![CDATA[【题目描述】
一只青蛙一次可以跳上1级台阶，也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
【思路】
之前的台阶是一次1或2级，如今可以1~n级，举一反三，那么fn = fn-1+fn-2 + …+f1 + 1
【代码】
int jumpFloorII(int n) {
        if(n &lt; 3) return n;
        int res;
        int sum = 3;
        for(int i = 3; i &lt;= n; ]]></description><category></category></item><item><title><![CDATA[二叉树镜像]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106101112</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106101112</guid><author>fujch3</author><pubDate>Wed, 13 May 2020 16:30:14 +0800</pubDate><description><![CDATA[【题目描述】
操作给定的二叉树，将其变换为源二叉树的镜像
【思路】
简单的二叉树遍历，交换左右子树即可
【代码】
void Mirror(TreeNode *pRoot) {
        if(!pRoot) return;
        if(!pRoot-&gt;left &amp;&amp; !pRoot-&gt;right) return;
        swap(pRoot-&gt;left,pRoot-&gt;right);
        Mirror(pRoot-&gt;left);]]></description><category></category></item><item><title><![CDATA[不用加减乘除做加法]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106100397</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106100397</guid><author>fujch3</author><pubDate>Wed, 13 May 2020 16:08:36 +0800</pubDate><description><![CDATA[【题目描述】
写一个函数，求两个整数之和，要求在函数体内不得使用+、-、*、/四则运算符号。
【思路】
不用“+，-，*，/”，那不就是摆明了用位运算，这时我们可以想到异或和与，两树二进制相加，异或得到的是没有加进位的结果，与得到的是需要进位的结果，如果进位不为0，那么继续异或和与，反之，则为最后相加的结果
【代码】
int Add(int num1, int num2)
    {
        int res, carry;
        do
        {
            res =]]></description><category></category></item><item><title><![CDATA[构建乘积数组]]></title><link>https://blog.youkuaiyun.com/fujch3/article/details/106099285</link><guid>https://blog.youkuaiyun.com/fujch3/article/details/106099285</guid><author>fujch3</author><pubDate>Wed, 13 May 2020 15:39:03 +0800</pubDate><description><![CDATA[题目描述：
给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。（注意：规定B[0] = A[1] * A[2] * … * A[n-1]，B[n-1] = A[0] * A[1] * … * A[n-2];）
思路：
暴力法：直接循环n次，每次乘以i以外的所有数字，显然这种方法比较耗时
左右乘积法：用两个数组来分别累积计算乘积, 左数组即从左往右相乘，右数组则从右往左乘积，然后那么]]></description><category></category></item></channel></rss>