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)