Content
88. Merge Sorted Array(E)
Description
Analysis & Solution
合并两个有序数组
(1)最暴力的方法,将nums2的元素塞到nums1末尾,然后进行排序,时间复杂度为
O
(
(
m
+
n
)
l
o
g
(
m
+
n
)
)
O((m+n)log(m+n))
O((m+n)log(m+n))。
(2)双指针分别指向两个数组,从左向右移动,每次比较,较小者存入结果数组。此方法时间复杂度为
O
(
m
+
n
)
O(m+n)
O(m+n),但需要额外空间
O
(
m
)
O(m)
O(m)存储nums1的元素。
(3)同样采用双指针i和j,指向nums1的m和nums2的n位置,从右向左移动。令设一指针k指向nums1的末尾,每次i和j所指的值比较,较大者和k所指的值交换。
Code
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
int i = m - 1, j = n - 1, k = m + n - 1;
while(j >= 0)
{
if(i >= 0 && nums1[i] > nums2[j]) swap(nums1[i--], nums1[k--]);
else swap(nums1[k--], nums2[j--]);
}
}
时间复杂度: O ( m + n ) O(m+n) O(m+n)。
89. Gray Code(M)
Description
Analysis & Solution
此题目解法较多,可以直接使用格雷编码的公式:
Code
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> ret(1<<n);
for(int i=0;i<1<<n;i++)
ret[i]=i^i>>1;
return ret;
}
};
时间复杂度:一次循环,时间复杂度为 O ( n ) O(n) O(n)。
104. Maximum Depth of Binary Tree(E)
Description
Analysis & Solution
求树的最大深度,可以用递归的方式进行分治。若当前节点为空,返回0;否则返回其左子树的最大深度与右子树最大深度的最大值加1。
Code
int maxDepth(TreeNode *root)
{
if(root == nullptr)
return 0;
else
return max(maxDepth(root->left), maxDepth(root->right)) + 1;
}
时间复杂度: O ( l o g n ) O(logn) O(logn)