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;
        }

    }
};
posted @ 2021-09-14 10:34  勒勒乐了  阅读(31)  评论(0)    收藏  举报