MST
星途 面试题库

面试题:Java控制流语句的嵌套优化

现有一个二维数组int[][] array = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}},请使用多层循环控制流语句遍历该数组,找出数组中的最大值和最小值,并将数组中的所有元素按照从小到大的顺序重新排列。请分析你的代码的时间复杂度,并说明如何通过控制流语句的优化来降低时间复杂度。
20.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
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));
    }
}
  1. 时间复杂度分析
    • 遍历二维数组将其展平为一维数组,时间复杂度为 $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))$。
  2. 控制流语句优化以降低时间复杂度
    • 遍历部分较难优化,因为要遍历每个元素。
    • 排序部分可以考虑使用更适合特定数据规模和特性的排序算法。例如,对于小规模数据,可以使用插入排序,其时间复杂度在最好情况下为 $O(n)$,平均和最坏情况下为 $O(n^2)$。但对于较大规模数据,Arrays.sort 中使用的双轴快速排序或归并排序在平均情况下表现较好。如果数据已经部分有序,可以考虑使用自适应排序算法,如自适应归并排序,在部分有序数据上时间复杂度接近 $O(n)$。

注:上述代码使用Java语言实现,不同编程语言实现细节略有不同,但思路类似。