题目描述
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
初始化 A 和 B 的元素数量分别为 m 和 n。
示例:
输入:
A = [1,2,3,0,0,0], m = 3
B = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
解法一:合并数组(Python)
时间复杂度:
O
(
(
m
+
n
)
log
(
m
+
n
)
)
\mathcal O((m+n)\log(m+n))
O((m+n)log(m+n))
空间复杂度:
O
(
log
(
m
+
n
)
)
\mathcal O(\log(m+n))
O(log(m+n))
排序序列长度为
m
+
n
m+n
m+n,套用快速排序的空间复杂度即可
class Solution:
def merge(self, A: List[int], m: int, B: List[int], n: int) -> None:
"""
Do not return anything, modify A in-place instead.
"""
A[m:] = B
A.sort()
解法二:逆双指针(C++)
使用 idx1 和 idx2 两个指针分别指向 A 和 B 的末端,每次将较大的数填充到 A 的末尾即可。
当 A 已经填充完毕而 B 还有剩余时,直接将 B 的剩余部分填充到 A 的头部。
时间复杂度:
O
(
m
+
n
)
\mathcal O(m+n)
O(m+n),两个指针分别移动 m 和 n 的距离。
空间复杂度:
O
(
1
)
\mathcal O(1)
O(1),对数组进行原地修改。
class Solution {
public:
void merge(vector<int>& A, int m, vector<int>& B, int n) {
int idx1 = m-1, idx2 = n-1, cur = m+n-1;
while(idx1>-1 && idx2>-1)
{
if(A[idx1]<B[idx2])
{
A[cur]= B[idx2];
idx2--;
cur--;
}
else
{
A[cur] = A[idx1];
idx1--;
cur--;
}
}
if(idx2!=-1)
{
for(int i=0;i<=idx2;i++) A[i] = B[i];
}
}
};