1.解答之前的碎碎念:
这道题拿到手第一时间想到的就是插入排序,不过插入排序时间复杂度为O(n^2),实在是太高了。。。当然,这道题对复杂度没有要求,不过还是尽量想一个时间复杂度低一点的算法比较好~
2.问题描述:
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
- 初始化 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]
3.解答思路:
参考链接:https://www.jianshu.com/p/88203168eb42
摘录:
提示中已经给出,假设array1有足够的空间了,于是我们不需要额外构造一个数组,并且可以从后面不断地比较元素进行合并。
- 比较array2与array1中最后面的那个元素,把最大的插入第m+n位
- 改变数组的索引,再次进行上面的比较,把最大的元素插入到array1中的第m+n-1位。
- 循环一直到结束。循环结束条件:当index1或index2有一个小于0时,此时就可以结束循环了。如果index2小于0,说明目的达到了。如果index1小于0,就把array2中剩下的前面的元素都复制到array1中去就行。
特殊输入情况:
- 当array1为空,array2不为空时,将array2的所有元素添加到array1中即可
- 当array1不为空,array2为空时,就是上面的循环结束条件,直接返回array1.
- 当array1跟array2都为空时,返回空。
重点:一般这种合并有序的序列,思路应该都是从后向前合并。
4.答案:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(m == 0)
{
for(int i = 0;i < n;i++)
{
nums1[i] = nums2[i];
}
}
else
{
int count1 = m - 1;
int count2 = n - 1;
while(count1 >= 0 && count2 >= 0)
{
if(nums1[count1] > nums2[count2])
{
nums1[count1 + count2 + 1] = nums1[count1];
count1--;
}
else
{
nums1[count1 + count2 + 1] = nums2[count2];
count2--;
}
}
if(count1 < 0)
{
for(int i = 0;i <= count2;i++)
{
nums1[i] = nums2[i];
}
}
}
}
};