1、合并两个排序的整数数组A和B变成一个新的数组。
样例
给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]
思想:与合并两个排序链表思想相同
注意,在做含有vector等容器类时,尽量使用其性质做,一是可以快速熟悉其应用,二是比较简单。
class Solution {
public:
/*
* @param A: sorted integer array A
* @param B: sorted integer array B
* @return: A new sorted integer array
*/
vector<int> mergeSortedArray(vector<int> &A, vector<int> &B) {
// write your code here
vector<int> C;
int i=0,j=0;
while(i<A.size()&&j<B.size())
{
if(A[i]<=B[j])
C.push_back(A[i++]);
else
C.push_back(B[j++]);
}
while(i<A.size())
C.push_back(A[i++]);
while(j<B.size())
C.push_back(B[j++]);
return C;
}
};
反思
class Solution {
public:
/*
* @param A: sorted integer array A
* @param B: sorted integer array B
* @return: A new sorted integer array
*/
vector<int> mergeSortedArray(vector<int> &A, vector<int> &B) {
// write your code here
vector<int> C;
//此处错误,因为下面C为数组形式,故定义时需要标明数组长度应为 vector<int> C(A.size()+B.size());
int i=0,j=0,k=0;
while(i<A.size()&&j<B.size())
{
if(A[i]<=B[j])
C[k ]=A[i++];
else
C[k ]=B[j++];
k++;
}
while(i<A.size())
C[k++]=A[i++];
while(j<B.size())
C[k++]=B[j++];
return C;
}
};
2、合并两个排序的整数数组A和B变成一个新的数组。
注意事项
你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素。
样例
给出 A = [1, 2, 3, empty, empty]
, B = [4, 5]
合并之后 A 将变成 [1,2,3,4,5]
思想:我们来看这两个题目,其实求解的东西一样,不同在于,第一个问题是新建一个排序好的新数组,
而第二题是将一个数组合并
到另一个数组中去。
怎样做呢?两个题的基本思路都一样:通过两个指针同时扫描两个数组。但第二题中给出的代码,不允许用vector类
做,故只能用普通数组来做。
再仔细思考,当B中有元素小于A中元素时,是需要将其插入A中的,这时候,A中需要大量移动元素,那么为了避免这一大规模的移动,
我们可以采用从后向前扫描的方法。
代码
class Solution {
public:
/*
* @param A: sorted integer array A which has m elements, but size of A is m+n
* @param m: An integer
* @param B: sorted integer array B which has n elements
* @param n: An integer
* @return: nothing
*/
void mergeSortedArray(int A[], int m, int B[], int n) {
// write your code here
int k = m + n - 1; // Index of last location of array A
int i = m - 1; // Index of last element in array A
int j = n - 1; // Index of last element in array B
// Start comparing from the last element and merge A and B
while (i >= 0 && j >= 0)//为了免除数组向后移动的复杂性,我们可以将其从后面向前进行比较
{
if (A[i] > B[j])
A[k--] = A[i--];
else
A[k--] = B[j--];
}
while (j >= 0)
A[k--] = B[j--];
}
};