题目简述
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
提示
- nums1.length == m + n
- nums2.length == n
- 0 <= m, n <= 200
- 1 <= m + n <= 200
- -10^9 <= nums1[i], nums2[i] <= 10^9
题目分析
碰到这种题,当然少不了“小聪明”,那就是直接把数组2的元素加在数组1后面,然后对数组1进行sort排序。代码如下:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(int i=m;i<m+n;i++){
nums1[i]=nums2[i-m];
}
sort(nums1.begin(),nums1.end());
}
};
正经的方法就是从后往前修改,判断数组1和数组2的末尾元素谁大,把大的放在数组1最后面。代码如下:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(int i=n-1;i>=0;i--){
if(m==0||nums1[m-1]<=nums2[i])nums1[m+i]=nums2[i];
else {
nums1[m+i]=nums1[m-1];
m--;
i++;
}
}
}
};