美文网首页
Leetcode88-合并两个有序数组

Leetcode88-合并两个有序数组

作者: 西5d | 来源:发表于2018-03-23 09:32 被阅读27次

    这题归在简单分类,只能说思路要求简单,也是比较经典的题目,给数组arr1,arr2,都是有序且升序,数组包含的有效元素分别为m,n,要求合并到arr1里,预设arr1的容量不小于m+n。这里做个定义:预备往里填充的数组称为母数组,待填入的数组称为子数组。思路是从末尾的元素开始,依次比较,如果母数组尾部元素大于子数组尾部元素,移动当前位置元素到尾部,递进,比较下一个,如果还大,母数组游标前移,依次比较;如果母数组当前尾部元素比子数组尾部元素小,则跳出循环,相当于一次切换,将子数组尾部元素移动到母数组尾部,如果还大,子数组游标前移,依次执行比较。
    以上属于一般情况,有两种特例:

    1. 子数组为空,直接返回
    2. 母数组为空,复制子数组元素到母数组;这部分合并到一般情况的比较中,减少循环;

    以下为代码,包括简单注释:

     public static void main(String[] args) {
            //定义nums1为母数组,nums2为子数组,合并子数组到母数组,都是有序的
            //从末尾比较放到母数组末尾
            //注意nums1的长度必须大于m+n,其中m和n分别表示nums1和nums2里有效元素的数目。
    
            int[] nums1 = new int[]{1,0};
            int[] nums2 = new int[]{2};
            int m = 1, n = 1;
            merge(nums1, m, nums2, n);
            System.out.println(Arrays.toString(nums1));
        }
    
        public static void merge(int[] nums1, int m, int[] nums2, int n) {
            int i = 1, j = 1;
            //特殊情况1,子数组为空
            if (n == 0) {
                return;
            }
    
            while (j <= n) {
                //特殊情况2,母数组为空,复制子数组到母数组
                if (m == 0) {
                    nums1[j - 1] = nums2[j - 1];
                    j++;
                    continue;
                }
    
                //一般情况,母数组末尾比最新子数组末尾大,移动母数组元素到末尾
                while (i <= m) {
                    if (nums1[m - i] > nums2[n - j]) {
                        nums1[m + n - i - j + 1] = nums1[m - i];
                        i++;
                    }else {
                        //否则跳到3
                        break;
                    }
                }
                //3 移动子数组元素到母数组当前尾部
                nums1[m + n - i - j + 1] = nums2[n - j];
                j++;
            }
        }
    

    相关文章

      网友评论

          本文标题:Leetcode88-合并两个有序数组

          本文链接:https://www.haomeiwen.com/subject/fywaqftx.html