提供方法,直接调用,支持任意个数组的合并成一个数组,并且完成排序,每个数组元素个数不定。需要提供两个方法,分别做到时间复杂度最低、空间复杂度最低。并说明两个方法的时间复杂度和空间复杂度
面试题: 题目就这样,只能理解到这,望大家给出正确的答案。
1、时间复杂度最低 (暂时还没研究明白....)
2、空间复杂度最低 (凑合看吧)在资料书中看到的
package lcr;
public class ArrayMerge {
public static void main(String[] args) {
int[] a = new int[10];
a[0] = 100;
a[1] = 111;
a[2] = 112;
int[] b = { 10, 11, 12 };
merge(a, 3, b, 3);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i] + " ");
}
}
/**
* 空间复杂度最低
* 1.假定一个新的数组,长度为合并之后的长度 m + n
* 2.比较大小,较大的往后移动,指针前移
* 3.合并之后的数组不新分配内存空间,而是利用已有的数组存放
* 4.参数在末端插入,如果数组空间没有填满,复杂度为O(1)
* @param a
* @param m
* @param b
* @param n
*/
public static void merge(int a[], int m, int b[], int n) {
int i = m - 1;
int j = n - 1;
int index = m + n - 1; //假定一个新的数组,长度为合并之后的长度 m + n
while (i >= 0 && j >= 0) {
if (a[i] > b[j]) { //比较大小,较大的往后移动,指针前移
a[index] = a[i];
index = index - 1;
i = i - 1;
} else {
a[index] = b[j];
index = index - 1;
j = j - 1;
}
}
while (i >= 0) {
a[index] = a[i];
index = index - 1;
i = i - 1;
}
while (j >= 0) {
a[index] = b[j];
index = index - 1;
j = j - 1;
}
}
}