文章目录
1. 问题描述
Merge two given sorted ascending integer array A and B into a new sorted integer array.
2. my solution
2.1 我的思路
因为数组是有序的,那么从第一个元素开始对数组A,B进行逐个比较
- 如果有一个数组比较完那么就把剩下的那个数组的元素都安次序给放到数组中
2.2 代码实现
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
int a = A.size();
int b = B.size();
int ai = 0;
int bi = 0;
int i = 0;
vector<int> v;
while(ai<a && bi<b)
if(A[ai]>B[bi])
v[i++] = B[bi++];
else
v[i++] = A[ai++];
while(ai<a)
v[i++] = A[ai++];
while(bi<b)
v[i++] = B[bi++];
return v;
}
};
2.3 运行结果
虽然效果还可以, 但是基本处在中游的位置, 应该看看大佬们的代码学习一下
3. 别人的实现
3.1 思路一(较差)
时间复杂度:
O
(
n
1
∗
n
2
)
O(n_1*n_2)
O(n1∗n2)
空间复杂度 :
O
(
n
1
+
n
2
)
O(n_1+n_2)
O(n1+n2)
3.1.1 基本步骤
- 创建一个大小为z1+z2的数组arr3
- 复制arr1中的n1个元素到arr3中
- 遍历arr2插入元素, 需要 O ( n 1 ∗ n 2 ) O(n_1*n_2) O(n1∗n2)的时间
由于时间复杂度较高, 就不实现了
3.2 思路二(较好)
时间复杂度:
O
(
n
1
+
n
2
)
O(n_1+n_2)
O(n1+n2)
空间复杂度 :
O
(
n
1
+
n
2
)
O(n_1+n_2)
O(n1+n2)
步骤如下
- 创建一个大小为n1+n2的数组arr3
- 同时遍历arr1[] 与 arr2[]
- 选择较小的元素从头开始插入到arr3中
- 如果arr1 与arr2中还有剩余元素, 则全部复制到arr3中
可以看到这个方法与我的思路只差了一步创建大小为n1+n2的数组, 但是
下面的图片是一个示例
3.2.1 代码实现
public class Solution {
/**
* @param A: sorted integer array A
* @param B: sorted integer array B
* @return: A new sorted integer array
*/
public int[] mergeSortedArray(int[] A, int[] B) {
// write your code here
int[] answer = new int[A.length + B.length];
int i = 0, j = 0, k = 0;
while (i < A.length && j < B.length)
answer[k++] = A[i] < B[j] ? A[i++] : B[j++];
while (i < A.length)
answer[k++] = A[i++];
while (j < B.length)
answer[k++] = B[j++];
return answer;
}
}
3.2.2 运行结果
可以看到效果很好, 奇怪的是, 后面我用C++实现的效率竟然不及java的一半?哪位大神可以在评论中解释一下