![](https://img.haomeiwen.com/i9118347/90ef3e3419045520.jpg)
需求:
已知两个升序的数组,合并他们,生成一个新的升序数组,不借助于其他API实现。
分析:
1、首先肯定需要定义一个新的数组空间,在已知的数组上做修改不现实,因为数组不擅长做插入和删除。
2、用原始的方法实现,也就是比较的方法,是一个笨方法,也是一个有效的办法。
3、涉及到三个数组,三个下标变量。
4、可以采用循环和递归两种方式来实现。
源码实现:
1、循环实现
public static void main(String[] args) {
int[] a = {1, 3, 6};
int[] b = {2, 4, 5, 7, 9};
int[] c = new int[a.length + b.length];
circulate(a, b, c);
for (int x : c) {
System.out.println(x);
}
}
public static void circulate(int[] a, int[] b, int[] c) {//循环实现
int i = 0, j = 0, k = 0;
while (i < a.length && j < b.length) {//两个数组都还没有遍历结束,长度短的会先遍历完,触发这个条件不满足
if (a[i] < b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while (i < a.length) {//b数组已经遍历结束,把a数组剩余的元素迭代赋值给新数组
c[k++] = a[i++];
}
while (j < b.length) {//a数组已经遍历结束,把b数组剩余的元素迭代复制给新数组
c[k++] = b[j++];
}
}
2、递归实现
static int[] a = {1, 3, 6};
static int[] b = {2, 4, 5, 7, 9};
static int[] c = new int[a.length + b.length];
static int k = 0, i = 0, j = 0;
public static void main(String[] args) {
recursive(i, j);
for (int x : c) {
System.out.println(x);
}
}
public static void recursive(int i, int j) {//递归实现
if (i + j == a.length + b.length)//终止条件
return;
if (i < a.length && j < b.length) {
if (a[i] < b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
} else {
if (i < a.length)
c[k++] = a[i++];
if (j < b.length)
c[k++] = b[j++];
}
recursive(i, j);
}
总结:
做算法题的过程中,一定要有耐心,用笔在纸上一步一步的写着可能的解决方案。然后,根据写的思路,抽象、归纳出通用的算法。坚持做下去,收获肯定会颇丰的。
网友评论