题目:给你两个有序整数数组 nums1
和 nums2
,请你将 nums2
合并到 nums1
中,使 nums1
成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 有足够的空间(空间大小等于 m + n)来保存 nums2 中的元素
链接:https://leetcode-cn.com/problems/merge-sorted-array
示例:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
方案一:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> res = vector<int>(m+n);
int i = 0, j = 0;
int num = 0;
while(i < m || j < n) {
if (i >= m || ((j < n) && (nums1[i] > nums2[j]))) {
res[num++] = nums2[j++];
} else {
res[num++] = nums1[i++];
}
}
for (int i = 0; i < m+n; i++) {
nums1[i] = res[i];
}
return;
}
};
时间复杂度
空间复杂度
方案二:对方案一进行优化, 建立临时数组,将nums1 copy出来, 然后用nums1 存储临时数组与nums2的合并结果。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> temp = vector<int>(m);
for (int i = 0; i < m; i++) {
temp[i] = nums1[i];
}
int i = 0, j = 0;
int num = 0;
while(i < m || j < n) {
if (i >= m || ((j < n) && (temp[i] > nums2[j]))) {
nums1[num++] = nums2[j++];
} else {
nums1[num++] = temp[i++];
}
}
return;
}
};
时间复杂度
空间复杂度
方案三:先合并,后排序
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for (int i = 0; i < n; i++) {
nums1[m + i] = nums2[i];
}
sort(nums1.begin(), nums1.end());
return;
}
};
时间复杂度
空间复杂度