Leetcode每日一题:88.merge-sorted-array(合并两个有序数组)_编程题
思路:最容易想到的就是归并排序的归并策略了,时间复杂度O(m+n),空间复杂度O(n);但是官网给出了另一个难以想到的妙招,就是反向归并,因为nums1最后面的n个元素是空的,所以从后端开始归并,每次选择较大的放入nums1的最后面;
Leetcode每日一题:88.merge-sorted-array(合并两个有序数组)_官网_02
奇怪的是,明明空间复杂度差了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--];
        }
    }