要求:合并两个非递减数组放到nums1里面,长度m和n
思路:
法一:把nums2一个个插进来,插一次后移一次,最坏时间复杂度是全插到前面移动O(n)*(m),空间O(1)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int j=0;
for(int i=0;i<m+j&&j<n;i++){
if(nums2[j]<nums1[i]){
for(int k=m+j-1;k>=i;k--){
nums1[k+1]=nums1[k];
}
nums1[i]=nums2[j];
j++;
}
}
while(j<n){
nums1[m+j]=nums2[j];
j++;//注意别漏写了。。。
}
}
};
法二:先把nums2全加到nums1后面再用sort,时间O((m+n)log(m+n)),空间O(log(m+n))(快排)
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());
}
};
法三:新开一个数组把nums1nums2按顺序放进来,时间O(m+n),空间O(m+n)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=0;
int j=0;
int sorted[m+n];
int index=0;
while(i<m&&j<n){
if(nums1[i]<=nums2[j])
sorted[index++]=nums1[i++];
else sorted[index++]=nums2[j++];
}
while(i<m)
sorted[index++]=nums1[i++];
while(j<n)
sorted[index++]=nums2[j++];
for(int k=0;k<m+n;k++)
nums1[k]=sorted[k];
}
};
法四:两个数组从尾巴开始插,因为i始终不大于cur,可行,时间O(m+n),空间O(1),最好的解法
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=m-1;
int j=n-1;
int cur=m+n-1;
while(i>=0&&j>=0){
if(nums2[j]>=nums1[i])
nums1[cur--]=nums2[j--];
else nums1[cur--]=nums1[i--];
}
while(i>=0)
nums1[cur--]=nums1[i--];
while(j>=0)
nums1[cur--]=nums2[j--];
}
};