LeetCode 88. 合并两个有序数组

117 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

图片.png

思路

新建一个vector用于存储最终的合并结果,合并的话,使用两个指针,分别指向两个数组各自的元素,然后比较大小,小的加入最终的vector. 当然了这个方法的空间复杂度不是最优的。代码如下:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        vector<int> ans;
        int i=0,j=0;
        while((i<m)&&(j<n)){
            if(nums1[i]<=nums2[j]){
                ans.push_back(nums1[i]);
                i++;
            }
            else{
                ans.push_back(nums2[j]);
                j++;
            }
        }
        while(i<m){
            ans.push_back(nums1[i]);
            i++;
        }
        while(j<n){
            ans.push_back(nums2[j]);
            j++;
        }
        nums1=ans;
    }
};

解决方案2.0

上面的代码的空间复杂度还是高了一点,那么怎么降低呢?这道题给出的nums1的大小是m+n,因此,我们可以从大到小,进行操作,因为nums1后面的那n个位置是闲置的,我们可以利用起来。简而言之,就是利用了nums1后面的n个空位,然后从后往前去比较,最终实现合并。

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