给定两个有序整数数组 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]
分析:
首先是合并,那么可以每次挑选两个数组中最大的数将其插入到nums1的末尾,而由于数组本身有序,那么最大的数就只会出现在nums1和nums2的最后一个数字,所以我们可以依次比较两个数组最后面一个数字的大小,并将大的一个数填入nums1的末尾,每插入一个数就将待插入下标减一,知道其中一个数组比较完成。
当nums2比较完成后,由于nums1前面的元素没有移动,所以没有破坏数组的有序性。但是当nums1比较完成过后,会出现nums2剩下的元素没有插入到nums1中,此时就需要将nums2中剩余的元素插入到nums1中,也就是我下面代码中的fill函数。
持续改进ing。。。。。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
//从后面往前面放
//指向带插入下标
int temp = m+n-1;
//mn作为下标
m--;
n--;
while(n>=0 && m>=0){
if(nums1[m] > nums2[n]){
//大于就将其放入最后
nums1[temp] = nums1[m];
m--;
}else{
nums1[temp] = nums2[n];
n--;
}
//带插入下标减一
temp --;
}
if(m<0){
//说明nums2的全部小于nums1了,将nums2填充上去
fill(nums1,nums2,n);
}else{
//说明nums1的全部小于nums2了,不必处理
}
}
void fill(vector<int>& nums1,vector<int>& nums2, int n){
while(n>=0){
nums1[n] = nums2[n];
n--;
}
}
};