提示
LintCode中的相关算法题实现代码,可以在我的GitHub中下载。
题目要求
合并两个排序的整数数组A和B变成一个新的数组。
样例
给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]
挑战
你能否优化你的算法,如果其中一个数组很大而另一个数组很小?
解题思路
在确定两个排序的数组后,一般的解题思路是,使用循环比较大小,然后在根据大小排序插入。
我们可以这样考虑,从数组的尾端开始,我们可以在一个数组的基础上分配两个数组的大小长度,然后逆序比较。
思路分为两步;
1.在逆序的过程中,我们可以首先确定最后的位置,我们比较A数组和B数组,如果A大于B,那么将A的最后一个元素插入末尾,定位尾端的标志符向前推进,然后A向前推进,继续和B的尾端比较。
2.如果B的A的尾端,那么将B的最后一个元素插入末尾,定位尾端的标志符向前推进,然后B向前推进,继续和A的尾端比较。
具体的实现代码如下:
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.size()==0) return B;
else if(B.size()==0) return A;
int t=A.size()-1;
A.resize(t+B.size()+1);
int i=B.size();
int index=A.size()-1;
while(i)
{
if(A[t]>B[i-1])
{
A[index]=A[t];
t--;
}
else
{
A[index]=B[i-1];
i--;
}
index=index-1;
}
return A;
}
};