使用Java查找Matrix min max的其他方法

时间:2015-11-26 08:38:12

标签: java arrays matrix max min

package myArray;
// https://github.com/javadevelopcom/ArrayVsArrayList/blob/master/src/myArray/MatrixMinMax.java
public class MatrixMinMax {

    public static void matrixMinMax() {
        System.out.println("Matrix is a rectangular array of numbers, symbols, or expressions:" + "\n");

        int[][] matrix = {
                {10, 10, 10, 10, -10},
                {20, 20, 20, -20, 20},
                {30, 30, -30, 30, 30},
                {40, -40, 40, 40, 40},
                {-50, 50, 50, 50, 50}};

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) System.out.print(matrix[i][j] + " ");
            System.out.println();
        }
        int min = matrix[0][0];
        int max = matrix[0][0];

        for (int[] ints : matrix) {
            for (int i : ints) {
                if (i < min) {
                    min = i;
                }
                if (i > max) {
                    max = i;
                }
            }
        }
        System.out.println("MIN: " + min);
        System.out.println("MAX: " + max);
    }
}

Matrix Array min max,二维数组

5 个答案:

答案 0 :(得分:2)

虽然这仅仅是一种猜测,但根据整体情况,可能无法在实际数据成员中搜索最大值和最小值

int[][] matrix

但使用一些自定义方法来设置条目;此方法将对其他成员执行一些检查

int maximum = Integer.MIN_VALUE;
int minimum = Integer.MAX_VALUE;

并在必要时更换它们。这样的方法可以如下实现,并且上面的成员可以访问最大值和最小值。

void setEntry(int i, int j, in value)
{
    matrix[i][j] = value;
    minimum = Math.min(value, minimum);
    maximum = Math.max(value, maximum);
}

然而,这种方法基本上会花费时间搜索矩阵以设置矩阵条目的时间。

答案 1 :(得分:1)

我认为你不能做得比O(n ^ 2)好;由于数字没有排序,或者没有任何特定属性(例如,所有属性都适合某个范围),您必须访问每个数字,以确保它是否/不修改值现有的最大/最小。访问所有数字给出了n ^ 2次操作

答案 2 :(得分:0)

其中一种方法是将二维数组转换为1D列表,并使用Stream API获取最小值和最大值。

我们在上面的代码中使用Integer数组作为int数组。考虑以下实现。代码行数减少了。

            Integer[][] matrix = {
            {10, 10, 10, 10, -10},
            {20, 20, 20, -20, 20},
            {30, 30, -30, 30, 30},
            {40, -40, 40, 40, 40},
            {-50, 50, 50, 50, 50}};

            List<Integer> list = new ArrayList<Integer>();
            for (Integer[] array : matrix)
                list.addAll(Arrays.asList(array));
            int max = list.stream().max((p1, p2) -> p1.compareTo(p2)).get().intValue();
            int min = list.stream().min((p1, p2) -> p1.compareTo(p2)).get().intValue();
            System.out.println("MIN: " + min);
            System.out.println("MAX: " + max);

答案 3 :(得分:0)

这不是问题的答案,但我认为它有所启发,并提供了一些理论上的改进。

如果你想要一个O(n)复杂时间,你应该改变嵌套迭代for-loop:

 //in O(n^2)
 for (int[] ints : matrix) {
            for (int i : ints) {
                if (i < min) {
                    min = i;
                }
                if (i > max) {
                    max = i;
                }
            }
        }

类似于:

for(i = 0; i<(X*Y); i++)

在你的情况下X = 5,Y = 5;,然后迭代。

答案 4 :(得分:0)

或者您可以轻松使用lambdas来查找数组的最小值和最大值,如下所示:

public int getTheMaxOfRow(int matrix[][], int row) {
    return Arrays.stream(matrix).skip(row).limit(1).flatMapToInt(d -> Arrays.stream(d)).max().getAsInt();
}

public int getTheMinOfRow(int matrix[][], int row) {
    return Arrays.stream(matrix).skip(row).limit(1).flatMapToInt(d -> Arrays.stream(d)).min().getAsInt();
 }