Leetcode88-合并两个有序数组

2018-03-23  本文已影响27人  西5d

这题归在简单分类,只能说思路要求简单,也是比较经典的题目,给数组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++;
        }
    }
上一篇下一篇

猜你喜欢

热点阅读