题目描述
合并两个排序的整数数组A和B变成一个新的数组。
样例
给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]
原始代码
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
}
};
分析
可以看出题目的要求是将已知的两个数组中的元素按从小到大的顺序排列且保留重复的元素, 那么我们就只需要将两个数组中的元素比较大小填入新的数组中就可以了。
代码
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(A.size()+B.size());
int i = 0, j = 0;
while(i < A.size() && j < B.size()) {
if(A[i] < B[j]) {
C[i + j] = A[i];
i++;
} else {
C[i + j] = B[j];
j++;
}
}
if(i != A.size()) {
while(i < A.size()) {
C[i + j] = A[i];
i++;
}
}
if(j != B.size()) {
while(j < B.size()) {
C[i + j] = B[j];
j++;
}
}
return C;
}
};
优化
提交后显示100% 数据通过测试,然后去网上看看有没有更好的方法,果然找到了一位大佬写的代码:
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
if(A.empty())
return B;
if(B.empty())
return A;
int ASize=A.size();
int BSize=B.size();
int i=0,j=0;
vector<int> result;
while(i<ASize||j<BSize){
if(i==ASize){
result.push_back(B[j++]);
continue;
}
else if(j==BSize){
result.push_back(A[i++]);
continue;
}
else{
if(A[i]<B[j])
result.push_back(A[i++]);
else
result.push_back(B[j++]);
}
}
return result;
}
};
优点1:他考虑到了当向量A,B为空的情况。虽然我的代码遇见这种情况也能返回正确的结果,但是程序运行会浪费时间(运行了不必要的代码)。而他的代码遇见这种情况直接返回结果,不会运行之后的代码。
优点2:代码简练。代码较少,只用了一个循环就完成了要求。