LeetCode腾讯50题-Day9-88/89/104

LeetCode50题(17天)-Day9

88 合并两个有序数组

  • 题号:88
  • 难度:简单
  • https://leetcode-cn.com/problems/merge-sorted-array/

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

实现

  • 状态:通过
  • 59 / 59 个通过测试用例
  • 执行用时: 348 ms, 在所有 C# 提交中击败了 93.33% 的用户
  • 内存消耗: 29.2 MB, 在所有 C# 提交中击败了 6.43% 的用户
public class Solution
{
    public void Merge(int[] nums1, int m, int[] nums2, int n)
    {
        int j = 0;
        for (int i = 0; i < n; i++)
        {
            int num2 = nums2[i];
            while (num2 > nums1[j] && j < m)
            {
                j++;
            }
            int k = m;
            while (k > j)
            {
                nums1[k] = nums1[k - 1];
                k--;
            }
            m++;
            nums1[j] = num2;
        }
    }
}

89 格雷编码

  • 题号:89
  • 难度:中等
  • https://leetcode-cn.com/problems/gray-code/

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。

给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。

示例 1:

输入: 2
输出: [0,1,3,2]
解释:
00 - 0
01 - 1
11 - 3
10 - 2

对于给定的 n,其格雷编码序列并不唯一。
例如,[0,2,3,1] 也是一个有效的格雷编码序列。

00 - 0
10 - 2
11 - 3
01 - 1

示例 2:

输入: 0
输出: [0]
解释: 我们定义格雷编码序列必须以 0 开头。
    给定编码总位数为 n 的格雷编码序列,其长度为 2^n。
    当 n = 0 时,长度为 2^0 = 1。
    因此,当 n = 0 时,其格雷编码序列为 [0]

实现

雷格码

由 n 位推导 n+1 位结果时,n+1 位结果包含 n 位结果,同时包含 n 位结果中在高位再增加一个位 1 所形成的令一半结果,但是这一半结果需要与前一半结果镜像排列。

  • 状态:通过
  • 12 / 12 个通过测试用例
  • 执行用时: 296 ms, 在所有 C# 提交中击败了 95.83% 的用户
  • 内存消耗: 24.8 MB, 在所有 C# 提交中击败了 16.67% 的用户
public class Solution
{
    public IList<int> GrayCode(int n)
    {
        IList<int> lst = new List<int>();
        lst.Add(0);
        for (int i = 1; i <= n; i++)
        {
            for (int j = lst.Count - 1; j >= 0; j--)
            {
                int item = lst[j] + (1 << i - 1);
                lst.Add(item);
            }
        }
        return lst;
    }
}

104 二叉树的最大深度

  • 题号:104
  • 难度:简单
  • https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例

给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。


实现

第一种:利用队列实现层次遍历的思路

  • 执行结果:通过
  • 执行用时:108 ms, 在所有 C# 提交中击败了 88.13% 的用户
  • 内存消耗:25.5 MB, 在所有 C# 提交中击败了 5.97% 的用户
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
public class Solution
{
    public int MaxDepth(TreeNode root)
    {
        if (root == null)
            return 0;

        Queue<TreeNode> q = new Queue<TreeNode>();
        int deep = 0;
        q.Enqueue(root);

        while (q.Count != 0)
        {
            deep++;
            int count = 0;
            int size = q.Count;

            while (count < size)
            {
                TreeNode node = q.Dequeue();
                count++;

                if (node.left != null)
                    q.Enqueue(node.left);
                if (node.right != null)
                    q.Enqueue(node.right);
            }
        }
        return deep;
    }
}

第二种:利用递归

思路:递归分别求左右子树的最大深度,并加到原有层数上,最后返回两者中的最大值。

C# 实现

  • 执行结果:通过
  • 执行用时:132 ms, 在所有 C# 提交中击败了 16.62% 的用户
  • 内存消耗:25.5 MB, 在所有 C# 提交中击败了 6.06% 的用户
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
public class Solution
{
    public int MaxDepth(TreeNode root)
    {
        if (root == null)
            return 0;
        int llen = 1;
        int rlen = 1;
        if (root.left != null)
        {
            llen += MaxDepth(root.left);
        }
        if (root.right != null)
        {
            rlen += MaxDepth(root.right);
        }
        return llen > rlen ? llen : rlen;
    }
}

Python 实现

  • 执行结果:通过
  • 执行用时:40 ms, 在所有 Python3 提交中击败了 93.87% 的用户
  • 内存消耗:14.9 MB, 在所有 Python3 提交中击败了 10.18% 的用户
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if root is None:
            return 0
        llen, rlen = 1, 1
        if root.left is not None:
            llen += self.maxDepth(root.left)
        if root.right is not None:
            rlen += self.maxDepth(root.right)
        return max(llen, rlen)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值