思路:最容易想到的就是归并排序的归并策略了,时间复杂度O(m+n),空间复杂度O(n);但是官网给出了另一个难以想到的妙招,就是反向归并,因为nums1最后面的n个元素是空的,所以从后端开始归并,每次选择较大的放入nums1的最后面;
奇怪的是,明明空间复杂度差了O(m),但为什么跑出来结果差不多呢?
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
{
vector<int> a(m,0);
int i = 0, j = 0;
int index = 0;
for (int k = 0; k < m; k++)
{
a[k] = nums1[k];
}
while (i < m && j < n)
{
if (a[i] < nums2[j])
{
nums1[index++] = a[i++];
}
else
{
nums1[index++] = nums2[j++];
}
}
while (i < m)
{
nums1[index++]=a[i++];
}
while(j<n)
{
nums1[index++]=nums2[j++];
}
}
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
{
int i = m-1, j = n-1;
int index = m + n - 1;
while (i >= 0 && j >= 0)
{
if (nums1[i]<nums2[j])
{
nums1[index--]=nums2[j--];
}
else
{
nums1[index--]=nums1[i--];
}
}
while(i>=0)
{
nums1[index--]=nums1[i--];
}
while(j>=0)
{
nums1[index--]=nums2[j--];
}
}