题目描述
给出一个整数数组A和有序的整数数组B,请将数组B合并到数组A中,变成一个有序的升序数组
注意:
1.可以假设A数组有足够的空间存放B数组的元素,A和 B中初始的元素数目分别为m和n,A的数组空间大小为m+n
2.不要返回合并的数组,返回是空的,将数组B的数据合并到A里面就好了
3.A数组在[0,m-1]的范围也是有序的
例1:
A: [1,2,3,0,0,0],m=3
B: [2,5,6],n=3
合并过后A为:
A: [1,2,2,3,5,6]
方法一:暴力求解
求解思路
最直接求解的方法,将A和B数组直接合并成C数组,然后对C数组直接排序即可!
解题代码
class Solution
{
public:
void merge(int A[], int m, int B[], int n)
{
int clength=m+n;
int C[clength];//构造一个新的数组
for(int i=0;i<m;i++)
C[i]=A[i];
for(int i=m;i<m+n;i++)
C[i]=B[i-m];
//直接对C排序即可!(随便什么冒泡、选择、快排啥的,就当练练手)
for(int i=0;i<m+n;i++)
for(int j=i+1;j<m+n;j++)
{
if(C[i]>C[j])
{
int temp;
temp=C[i];
C[i]=C[j];
C[j]=temp;
}
}
for(int i=0;i<m+n;i++)
A[i]=C[i];
}
};复杂度分析
时间复杂度:两个循环,O( )
空间复杂度:开辟一个新的数组C,O(n+m),其中n和m分别为A和B数组的大小
方法二:双指针的思想
求解思路
使用双指针的思想,将A和B数组的指针顶到数组的最后一个位置,然后比较A,B数组的大小,然后从尾到头依次在A数组填入相应的数字,最后如果B数组有些数值比A数组的小,则将B数组直接遍历地填入A数组的头部位置即可。
解题代码
class Solution//参考文卿周槐芳的code
{
public:
void merge(int A[], int m, int B[], int n)
{
int aPtr = m - 1, bPtr = n - 1;
// 两数组元素从右至左比较,大的去 A 尾部,直至有一方指针到头为止
for (int ptr = m + n - 1; aPtr >= 0 && bPtr >= 0; ptr--)
{
A[ptr] = A[aPtr] > B[bPtr] ? A[aPtr--] : B[bPtr--];
}
// A 指针先走完的情况,B 中剩余元素直接copy至 A 对应位置即可;
while (bPtr >= 0)
{
A[bPtr] = B[bPtr];
bPtr--;
}
}
};复杂度分析
时间复杂度:一个循环,O(N)
空间复杂度:两个数组,没有引入其他的地址空间,O(1)

京公网安备 11010502036488号