2020-11-10-leetcode算法-合并两个有序数组

题目要求

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

 

说明:

初始化 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]
 

提示:

-10^9 <= nums1[i], nums2[i] <= 10^9
nums1.length == m + n
nums2.length == n

思路

纯copy

因为 nums1 的空间都集中在后面,所以从后向前处理排序的数据会更好,节省空间,一边遍历一边将值填充进去
设置指针 len1 和 len2 分别指向 nums1 和 nums2 的有数字尾部,从尾部值开始比较遍历,同时设置指针 len 指向 nums1 的最末尾,每次遍历比较值大小之后,则进行填充
当 len1<0 时遍历结束,此时 nums2 中海油数据未拷贝完全,将其直接拷贝到 nums1 的前面,最后得到结果数组
时间复杂度:O(m+n)O(m+n)

解法

 public void merge(int[] nums1, int m, int[] nums2, int n) {

            // nums1和nums2的指针
            int p1 = m - 1;
            int p2 = n - 1;
            // 设置nums1的指针
            int p = m + n - 1;
            
            while ((p1 >= 0) && (p2 >= 0))
                //从后往前遍历,比较两个数组的元素,nums2大于nums1的话,将赋给num1,反之
                nums1[p--] = (nums1[p1] < nums2[p2]) ? nums2[p2--] : nums1[p1--];

            // 从nums2中添加缺少的元素
            System.arraycopy(nums2, 0, nums1, 0, p2 + 1);

            // Make a copy of nums1.
      /*  int [] nums3 = new int[m];
        System.arraycopy(nums1, 0, nums3, 0, m);

        // Two get pointers for nums3 and nums2.
        int p3 = 0;
        int p2 = 0;

        // Set pointer for nums1
        int p1 = 0;

        // Compare elements from nums3 and nums2
        // and add the smallest one into nums1.
        while ((p3 < m) && (p2 < n))
            nums1[p1++] = (nums3[p3] < nums2[p2]) ? nums3[p3++] : nums2[p2++];

        // if there are still elements to add
        if (p3 < m)
            System.arraycopy(nums3, p3, nums1, p3 + p2, m + n - p3 - p2);
        if (p2 < n)
            System.arraycopy(nums2, p2, nums1, p3 + p2, m + n - p3 - p2);*/
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值