题目描述
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
样例
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
算法1
(暴力枚举) $O(n^2)$
。。。。
算法2 (从前往后) O(n)
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int i = 0, j = 0;
int k = 0;
int res[m + n];
while (i < m && j < n)
{
if (nums1[i] <= nums2[j]) res[k ++] = nums1[i ++];
else res[k ++] = nums2[j ++];
}
while (i < m) res[k ++] = nums1[i ++];
while (j < n) res[k ++] = nums2[j ++];
for (int i = 0; i < k; i ++)
nums1[i] = res[i];
}
算法3 (从后往前) O(n)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int end1 = m - 1;
int end2 = n - 1;
int end = n + m - 1;
while (end1 >= 0 && end2 >= 0)
{
if (nums1[end1] > nums2[end2])
nums1[end --] = nums1[end1 --];
else
nums1[end --] = nums2[end2 --];
}
while (end2 >= 0)
nums1[end --] = nums2[end2 --];
}
};
算法4 O(nlogn)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int j = m;
for (int i = 0; i < nums2.size(); i ++)
nums1[j ++] = nums2[i];
sort(nums1.begin(), nums1.end());
}
};