#LeetCode刷题——88、合并两个有序数组

1、题目介绍

 

2、思路分析 

一、第一种解法:直接合并,在进行排序

使用for循环直接将nums2数组复制到nums1后面,然后进行排序

代码:

        //第一种方法:直接合并后排序
        for (int i = 0; i < n; i++) {
            nums1[i + m] = nums2[i];
        }
        //排序
        Arrays.sort(nums1);

二、第二种解法:采用双指针法【类似于分治方法中的治】

        通过对比俩个数组中元素的值,将小的元素增加到 临时数组 temp 中,最终nums1和nums2哪个数组中有剩余元素直接增加到temp中。最后将temp拷贝到nums1中

 代码:

    //第二种方法:使用双指针,逐个比较俩个数组中的元素,把最小的放入temp数组中【类似于归并排序的合并步骤】
        int i = 0; //指向nums1
        int j = 0;//指向nums2
        int[] temp = new int[m + n];

        int index = 0;

        //对俩个数组进行遍历。进行比较,
        while (i < m && j < n) {
            if (nums1[i] > nums2[j]) {
                temp[index++] = nums2[j++];
            } else {
                temp[index++] = nums1[i++];
            }
        }
        //如果nums1还有剩余元素直接加到temp中
        while (i < m) {
            temp[index++] = nums1[i++];
        }
        //如果nums2还有剩余元素直接加到temp中
        while (j < n) {
            temp[index++] = nums2[j++];
        }
        //将temp数组拷贝到nums1
        System.arraycopy(temp,0,nums1,0,temp.length);

其中这里的代码一行就可以搞定:                                        
        while (i < m && j < n) {
            if (nums1[i] > nums2[j]) {
                temp[index++] = nums2[j++];     
            } else {
                temp[index++] = nums1[i++];
            }
        }

 替换成:

while(i < m && j < n){
    temp[index++] = nums1[i] > nums2[j] ? nums2[j++] : nums1[i++];
}

     

对数组进行拷贝的几种方法:

        1、for循环拷贝

 

        2、Arrays.copyOf(dataType[] srcArray , int length);  

                dataType[] srcArray:想要复制的数组        length : 复制的长度

 

        3、Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)

                int startIndex : 目标数组的起始索引,长度必须小于srcArray.length

                int endIndex : 目标数组的结束索引 ,长度可大于srcArray.length,空出来的部分默认填充

        4、System.arraycopy(dataType[] srcArray,int srcIndex,int destArray,int destIndex,int length)

 

                int srcIndex : 原数组起始索引 

                int destArray:目标数组

                int destIndex:目标数组起始索引

                length : 复制的长度

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲨瓜2号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值