Task09

本文链接: https://blog.csdn.net/qq_34811382/article/details/112910600

88 合并两个有序数组

在这里插入图片描述
思路:

双指针法
从后向前,p1后面有m+n-p1-1个元素,
在任意时刻nums1有m-1-p1个元素被放入后面,而nums2中有n-1-p2个元素被放入后面。
而(m+n-p1-1>m-1-p1+n-1-p2)==>(p2>-1)恒成立,所以从后面拿出的元素不会把前面的覆盖。

ps:temp = nums2[p2- -]等价于temp=nums2[p2]; p2=- -;

代码:

class Solution
{
    
    
public:
    void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
    {
    
    
        int p1 = m - 1, p2 = n - 1;
        int temp;
        while (p1 >= 0 || p2 >= 0)
        {
    
    
            if (p1 < 0)
            {
    
    
                temp = nums2[p2--];
            }
            else if (p2 < 0)
            {
    
    
                temp = nums1[p1--];
            }
            else if (nums1[p1] > nums2[p2])
            {
    
    
                temp = nums1[p1--];
            }
            else
            {
    
    
                temp = nums2[p2--];
            }
            nums1[p1 + p2 +2] = temp; //因为上面已经减了所以这里是加2
        }
    }
};

89 格雷编码

在这里插入图片描述
思路:

位运算
格雷编码,说白了就是二进制码上只有一位不同,利用异或运算计算。即
i^(i>>1),就是i与本身右移一位异或就是结果。

代码:

class Solution
{
    
    
public:
    vector<int> grayCode(int n)
    {
    
    
        vector<int> res(1 << n, 0);
        for (int i = 0; i < (1 << n); i++)
        {
    
    
            res[i] = i ^ (i << 1);
        }
        return res;
    }
};

104 二叉树的最大深度

在这里插入图片描述

思路:

利用递归的方法,判断是否为叶子节点,叶子节点即没有子节点,就是该节点==nullptr。

代码:

class Solution
{
    
    
public:
    int maxDepth(TreeNode *root)
    {
    
    
        if (root == nullptr)
            return 0;
        int LeftDepth = 1, RightDepth = 1;
        if (root->left != nullptr)
            LeftDepth += maxDepth(root->left);
        if (root->right != nullptr)
            RightDepth += maxDepth(root->right);
        return LeftDepth > RightDepth ? LeftDepth : RightDepth;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34811382/article/details/112910600