LeetCode——88. 合并两个有序数组

题目描述

题干:
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

示例1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]

示例2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]

题解思路

又是一道很熟悉的数据结构单链表部分的经典题,这种题有很多种,有不能开辟新空间的,也有合并到新数组中的

这道题属于简单题,限制条件不多,所以可以自己任意发挥,所以这就有了我第一种做法,只有一个我不熟悉的arraycopy方法

相比题目想让你用的双指针方法,这种方法的复杂度就完全看你数组长度了,这就是第二种方法

双指针的算法题列举过很多了,所以直接上代码了

正确代码

   /**
     * arraycopy函数参数定义
     * public static native void arraycopy(Object src,  int  srcPos,
     * Object dest, int destPos,
     * int length);
     * src:原数组
     * srcPos:原数组中开始复制的下标
     * dest:目标数组
     * destPos:从目标数组中开始复制的下标
     * length:从原数组中复制到目标数组中数据的个数
     */
    public static void merge1(int[] nums1, int m, int[] nums2, int n) {
        System.arraycopy(nums2, 0, nums1, m, n);
        Arrays.sort(nums1);
    }

    //双指针
    public static void merge2(int[] nums1, int m, int[] nums2, int n) {
        //复制nums1中的元素到新数组
        int[] nums1Copy = new int[m];
        System.arraycopy(nums1,0,nums1Copy,0,m);
        //定义两个比较大小的指针和一个写入指针
        int p1 = 0, p2 = 0, p = 0;

        //循环比较nums1Copy和nums2中的元素大小
        //小的用p指针写入nums1中
        while ((p1 < m) && (p2 < n))
            nums1[p++] = (nums1Copy[p1] < nums2[p2]) ? nums1Copy[p1++] : nums2[p2++];
        if (p1 < m)
            System.arraycopy(nums1Copy, p1, nums1, p, m + n - p);
        if (p2 < n)
            System.arraycopy(nums2, p2, nums1, p, m + n - p);
    }

总结

在学习Java的时候,有位老师说过,其实你在工作的时候,就是在不断学习类的过程

当时觉得很对,现在觉得也很对,但是其实真正内心里觉得学习一门语言如果只是为了工作,那你熟练的运用各种工具类就可以了

希望自己可以真的走上大牛的道路,在计算机这条路一直走下去,说不定哪一天真的变强了,这句话就可以去反驳了

第一次总结了个寂寞,文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见
posted @ 2021-03-04 16:05  21岁还不是架构师  阅读(59)  评论(0编辑  收藏  举报