【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--];
}
}