[LeetCode] Merge Sorted Array

https://leetcode.com/problems/merge-sorted-array/?tab=Description

要求不用辅助数组实现merge two sorted array,条件是一个数组的空间足够大。解法是先将nums1的所有元素整体向后平移n个单位,然后算法就和merge two sorted array一样了,只不过nums1的初始指针在位置n处。

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        for (int i = m - 1; i >= 0; --i) {
            nums1[i+n] = nums1[i];
        }
        
        int p = n, q = 0, k = 0;
        while (p < m + n && q < n) {
            if (nums1[p] < nums2[q])
                nums1[k++] = nums1[p++];
            else
                nums1[k++] = nums2[q++];
        }
        while (p < m + n) {
            nums1[k++] = nums1[p++];
        }
        while (q < n) {
            nums1[k++] = nums2[q++];
        }
    }
};

更好的做法是直接逆着做merge two sorted array, 一个指针从大数组的m-1位置开始,另一个指针从小数组的n-1位置开始,每次取较大的放在大数组的m+n-1位置, m+n-2位置,...

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int p = m - 1, q = n - 1, k = m + n - 1;
        while (p >= 0 && q >= 0) {
            if (nums1[p] > nums2[q]) {
                nums1[k--] = nums1[p--];
            } else {
                nums1[k--] = nums2[q--];
            }
        }
        while (p >= 0) {
            nums1[k--] = nums1[p--];
        }
        while (q >= 0) {
            nums1[k--] = nums2[q--];
        }
    }
};
原文地址:https://www.cnblogs.com/ilovezyg/p/6410230.html