LeetCode88 合并有序数组
1. 这道题为简单题目,但是还有需要好好思考的
2. 首先不能使用额外数组合并,不然就没得后文了
3. nums1后面有0填充,且填充数量正好是n,整个数组大小即m+n能够容纳合并后的数据
4.既然要在原来的数组上操作,有没有可能能够避免移动数据(降低时间复杂度?),使用交换方式
从后往前思考,类似于字符串空格替换(先开辟多余的空间)然后 使用多个指针 从后往前,避免移动数据
因此我们使用p,q,s三个index分别指向num1的数据最后一个,num2数据的最后一个,num1整个大小的最后一个
p = m-1,q = n-1,s=m+n-1;
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
//从后往前合并 两个指针合并
int p = m-1,q=n-1,s=m+n-1;
while(p>=0 && q>=0)
{
if(nums1[p]<nums2[q])
{
nums1[s] = nums2[q];
--s;
--q;
}
else
{
nums1[s] = nums1[p];
--s;
--p;
}
}
while(q>=0)
{
nums1[s] = nums2[q];
--s;
--q;
}
}
};
本文来自博客园,作者:勒勒乐了,转载请注明原文链接:https://www.cnblogs.com/matytan/p/15519534.html

浙公网安备 33010602011771号