题目:给定两个有序数组,nums1和nums2,将nums2合并到nums1中,使得nums1成为一个有序数组(假设nums1)有足够的空间
思路:
(1)申请一个新的数组,从前往后同时扫描两个数组,每次取两个数组中较小的元素,并将相应数组的扫描指针右移一步
题目假设nums1有足够的空间,则可以直接将Nums2中的数据合并到nums1中
数组的合并结果和原始数组Nums1的元素需要同时存在与nums1中
为了防止冲突,需要充分使用mums1中初始时未使用的空间,也即下标[m,m+n-1]
之间的空间
综合以上分析,算法同时逆向扫描两个数组,每次选择较大的元素并保存到nums1相应的位置,同时下标往前移动一位
如果从前往后扫描会占用之前nums1的位置,发生覆盖
不申请空间,直接将nums2合并到nums1中
/*void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
while(m&&n)nums1[m+n]=nums1[m-1]>nums2[n-1]?nums1[--m]:nums2[--n];
while(n)nums1[n]=nums2[--n];
}*/
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=m-1,j=n-1;
while(j>=0 && i>=0){
if(nums1[i]<nums2[j])
nums1[i+j+2]=nums2[j--];
else
nums1[i+j+2]=nums1[i--];
}
for(;j>=0;j--){
nums1[j]=nums2[j];
}
}
};