【leetcode】88. Merge Sorted Array

题目说明

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
https://leetcode-cn.com/problems/merge-sorted-array/

解法1

时间复杂度:O(n)
空间复杂度:O(n)
思路:额外使用数组来保存合并过程中的数据,比较两数组对应元素的大小,将较小的元素保存在新的数组中,最后需要将两数组中没有比较的元素添加到新数组的末尾。

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
    vector<int> temp;
    int i = 0, j = 0;
    for (; i < m && j < n; )
    {
        temp.push_back(nums1[i] < nums2[j] ? nums1[i++]:nums2[j++]);
    }
    if (i < m)
    {
        for (;i < m; i ++)
            temp.push_back(nums1[i]);
    }
    else if (j < n)
    {
        for (;j < n; j ++)
            temp.push_back(nums2[j]);
    }
    nums1 = temp;
}

解法2

时间复杂度:O(n)
空间复杂度:O(1)
思路:从后往前开始比较与赋值,这样就不需要申请额外的空间来保存结果了,直接使用nums的空间。第一轮循环结束后,若i>0,则不需要再次合并(因为元素已经在数组中了);若j>0,说明nums2还有元素未合并到数组中,需要对num2再进行操作。

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
    int i = m - 1, j = n - 1,k = m + n - 1;
    while (i >=0 && j >=0)
    {
        nums1[k --] = nums1[i] >  nums2[j] ? nums1[i--] : nums2[j--];
    }
    while(j >= 0)
    {
        nums1[k --] = nums2[j--];
    }
}

猜你喜欢

转载自www.cnblogs.com/JesseTsou/p/10328648.html