思路:1. 归并:由于给出的两个数组都是有序的,而需要的结果也是有序的,那么每次从两个数组取最后的一个元素对比先填充大数即可,时间复杂度O(n+m)。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int l1 = m-1, l2 = n-1;
int end = m+n-1;
int tmp = 0;
while(l1>=0||l2>=0){
if(l1==-1) tmp = nums2[l2--]; // 如果nums1为空
else if(l2==-1) tmp = nums1[l1--]; // 如果nums2为空
else if(nums1[l1]>nums2[l2]) tmp = nums1[l1--]; // 取nums1和nums2尾部最大值
else tmp = nums2[l2--]; // 取nums1和nums2尾部最大值
nums1[end--] = tmp;
}
}
};
2. sort:nums1后面n个空间以及存在了,那么我们可以直接将nums2中的数填充进后n个位置,然后再对nums1进行sort排序一下即可,sort的时间复杂度为,故此时间复杂度为
。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(int i = 0; i < n; i ++){
nums1[m+i] = nums2[i];
}
sort(nums1.begin(), nums1.end());
}
};