面试题答案
一键面试import java.util.Arrays;
public class ArrayOperations {
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
int[] flatArray = new int[array.length * array[0].length];
int index = 0;
// 遍历二维数组,找出最大值和最小值,并将其展平为一维数组
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
int num = array[i][j];
if (num < min) {
min = num;
}
if (num > max) {
max = num;
}
flatArray[index++] = num;
}
}
// 对一维数组进行排序
Arrays.sort(flatArray);
System.out.println("最小值: " + min);
System.out.println("最大值: " + max);
System.out.println("排序后的数组: " + Arrays.toString(flatArray));
}
}
- 时间复杂度分析:
- 遍历二维数组将其展平为一维数组,时间复杂度为 $O(n \times m)$,其中 $n$ 是二维数组的行数,$m$ 是二维数组的列数。这里数组是方阵,$n = m = 3$,但一般化时间复杂度为 $O(n \times m)$。
- 使用
Arrays.sort
对一维数组进行排序,其时间复杂度为 $O(k \log k)$,其中 $k = n \times m$。 - 整体时间复杂度为 $O(n \times m + k \log k)$,因为 $k = n \times m$,所以整体时间复杂度为 $O(n \times m + (n \times m) \log (n \times m))$,在渐近意义下,主要部分是 $O((n \times m) \log (n \times m))$。
- 控制流语句优化以降低时间复杂度:
- 遍历部分较难优化,因为要遍历每个元素。
- 排序部分可以考虑使用更适合特定数据规模和特性的排序算法。例如,对于小规模数据,可以使用插入排序,其时间复杂度在最好情况下为 $O(n)$,平均和最坏情况下为 $O(n^2)$。但对于较大规模数据,
Arrays.sort
中使用的双轴快速排序或归并排序在平均情况下表现较好。如果数据已经部分有序,可以考虑使用自适应排序算法,如自适应归并排序,在部分有序数据上时间复杂度接近 $O(n)$。
注:上述代码使用Java语言实现,不同编程语言实现细节略有不同,但思路类似。