使用 Java 查找矩阵最小最大值的替代方法
Alternative ways to find Matrix min max using Java
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);
}
}
矩阵数组最小值最大值,二维数组
虽然这只是推测,但根据整体上下文,可能不会在实际数据成员中搜索最大值和最小值
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);
}
但是,这种方法基本上是以搜索矩阵的时间换取设置矩阵条目的时间。
其中一种方法是将二维数组转换为一维列表并使用 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);
这不完全是问题的答案,但我认为它阐明了一些问题并提供了一些理论改进。
如果您想要 O(n) 复杂度时间,您应该更改嵌套迭代 for 循环:
//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;
然后迭代。
或者您可以轻松地使用 lambda 来查找数组的最小值和最大值,如下所示:
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();
}
我认为你不能做得比 O(n^2) 更好;由于数字未排序,或者没有任何特定的 属性(例如,所有数字都适合某个范围),您必须访问每个数字,以确保它是否 does/doesn '修改已有的maximum/minimum的值。访问所有数字给出 n^2 操作
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);
}
}
矩阵数组最小值最大值,二维数组
虽然这只是推测,但根据整体上下文,可能不会在实际数据成员中搜索最大值和最小值
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);
}
但是,这种方法基本上是以搜索矩阵的时间换取设置矩阵条目的时间。
其中一种方法是将二维数组转换为一维列表并使用 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);
这不完全是问题的答案,但我认为它阐明了一些问题并提供了一些理论改进。
如果您想要 O(n) 复杂度时间,您应该更改嵌套迭代 for 循环:
//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;
然后迭代。
或者您可以轻松地使用 lambda 来查找数组的最小值和最大值,如下所示:
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();
}
我认为你不能做得比 O(n^2) 更好;由于数字未排序,或者没有任何特定的 属性(例如,所有数字都适合某个范围),您必须访问每个数字,以确保它是否 does/doesn '修改已有的maximum/minimum的值。访问所有数字给出 n^2 操作