Leetcode88-合并两个有序数组
2018-03-23 本文已影响27人
西5d
这题归在简单分类,只能说思路要求简单,也是比较经典的题目,给数组arr1,arr2,都是有序且升序,数组包含的有效元素分别为m,n,要求合并到arr1里,预设arr1的容量不小于m+n。这里做个定义:预备往里填充的数组称为母数组,待填入的数组称为子数组。思路是从末尾的元素开始,依次比较,如果母数组尾部元素大于子数组尾部元素,移动当前位置元素到尾部,递进,比较下一个,如果还大,母数组游标前移,依次比较;如果母数组当前尾部元素比子数组尾部元素小,则跳出循环,相当于一次切换,将子数组尾部元素移动到母数组尾部,如果还大,子数组游标前移,依次执行比较。
以上属于一般情况,有两种特例:
- 子数组为空,直接返回;
- 母数组为空,复制子数组元素到母数组;这部分合并到一般情况的比较中,减少循环;
以下为代码,包括简单注释:
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++;
}
}