腾讯精选50题—Day9题目88,89,104
刷题的第九天~~~一定可以的!
1. 题目88 合并两个有序数组
(1) 题目描述
(2) 思路
因为vector1长度完全可以放得下,那么直接从vector1的m-1位置和vector2的n-1位置比较,将大的放在vector1的m+n-1位置上即可。
(3) 题解
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = m - 1;
int p2 = n - 1;
int end = m + n - 1;
while (p1 >= 0 || p2 >= 0)
{
if (p1 < 0)
{
nums1[end--] = nums2[p2--];
}
else if (p2 < 0)
{
return;
}
else if (nums1[p1] >= nums2[p2])
{
nums1[end] = nums1[p1];
end--;
p1--;
}
else {
nums1[end] = nums2[p2];
end--;
p2--;
}
}
}
};
结果:
时间复杂度:
O
(
m
+
n
)
O(m+n)
O(m+n)
空间复杂度:
O
(
1
)
O(1)
O(1)
2. 题目89 格雷编码
(1) 题目描述
(2) 思路
位运算~再分析。
(3) 题解
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> result;
for (int i = 0; i < (1 << n); i++)
{
result.push_back(i ^ i >> 1);
}
return result;
}
};
结果:
时间复杂度:
O
(
2
n
)
O(2^n)
O(2n)
空间复杂度:
O
(
1
)
O(1)
O(1)
3. 题目104 二叉树深度
(1) 题目描述
(2) 思路
美妙的二叉树,递归呀呀呀呀呀呀~
(3) 题解
class Solution {
public:
int maxDepth(TreeNode* root) {
int result = Travel(root);
return result;
}
int Travel(TreeNode* root) {
if (!root)
return 0;
else {
return (max(Travel(root->left), Travel(root->right))+1);
}
}
};
结果:
时间复杂度:
O
(
n
)
O(n)
O(n) n为二叉树的结点数
空间复杂度:
O
(
h
e
i
g
h
t
)
O(height)
O(height) height为二叉树的高度