本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
思路
新建一个vector用于存储最终的合并结果,合并的话,使用两个指针,分别指向两个数组各自的元素,然后比较大小,小的加入最终的vector. 当然了这个方法的空间复杂度不是最优的。代码如下:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> ans;
int i=0,j=0;
while((i<m)&&(j<n)){
if(nums1[i]<=nums2[j]){
ans.push_back(nums1[i]);
i++;
}
else{
ans.push_back(nums2[j]);
j++;
}
}
while(i<m){
ans.push_back(nums1[i]);
i++;
}
while(j<n){
ans.push_back(nums2[j]);
j++;
}
nums1=ans;
}
};
解决方案2.0
上面的代码的空间复杂度还是高了一点,那么怎么降低呢?这道题给出的nums1的大小是m+n,因此,我们可以从大到小,进行操作,因为nums1后面的那n个位置是闲置的,我们可以利用起来。简而言之,就是利用了nums1后面的n个空位,然后从后往前去比较,最终实现合并。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=m-1,j=n-1;
int p=m+n-1;
while((i>=0)&&(j>=0)){
if(nums1[i]<=nums2[j]){
nums1[p]=nums2[j];
j--;
p--;
}
else{
nums1[p]=nums1[i];
i--;
p--;
}
}
while(i>=0){
nums1[p]=nums1[i];
i--;p--;
}
while(j>=0){
nums1[p]=nums2[j];
j--;p--;
}
}
};