0

我有一个函数可以找到第一个最小值并从二维数组中返回它:

public static int getMinimumValueOfTerrain(int[][] terrain) {
    int min = Integer.MAX_VALUE;
    for (int row = 0; row < terrain.length; row++) {
        for (int col = 0; col < terrain[row].length; col++) {
            min = Math.min(min, terrain[row][col]);
        }
    }
    return min;
}

我有另一个函数应该用它的负值替换找到的最小值:

public static int[][] replaceMinusValue(int[][] terrain) {
    for (int row = 0; row < terrain.length; row++) {
        for (int col = 0; col < terrain[row].length; col++) {
            int tempValue = getMinimumValueOfTerrain(terrain);
            int minusValue = -tempValue;
        }
    }
    return terrain;
}

例子:

2 1 3
3 2 1
4 2 5

预期结果:

2 -1 3
3 2 1
4 2 5

我怎样才能用我的功能来处理它?

4

3 回答 3

2

您有多种选择。如果你只这样做一次或者效率无关紧要,你可以遍历整个数组并找到最小的元素,然后替换该元素。例如:

public static void replaceMinusValue(int[][] terrain) {
    int min = Integer.MAX_VALUE;
    int minI = -1;
    int minJ = -1;
    for (int i = 0; i < terrain.length; i++) {
        for (int j = 0; j < terrain[i].length; j++) {
            if (terrain[i][j] < min) {
                min = terrain[i][j];
                minI = i;
                minJ = j;
            }
        }
    }

    terrain[minI][minJ] *= -1;
}

会那样做。请注意,您不需要在翻转后返回地形(就像您在排序时不返回新数组一样)。

于 2021-01-25T19:57:12.453 回答
2

您还应该将min的行和列索引保留在getMinimumValueOfTerrain. for循环后,您可以更改terrain[minRow][minColumn]其负数。getMinimumValueOfTerrain如果没有约束,我认为只有方法就足够了。如果有,您可以编写另一个返回 2 元素索引数组的函数。

于 2021-01-25T19:32:12.107 回答
1

更快的实现是检测最小值的行和列坐标并修改该值:

public static int[][] findAndReplaceMinValue(int[][] terrain) {
    int min = Integer.MAX_VALUE;
    int minRow = -1, minCol = -1;

    for (int row = 0; row < terrain.length; row++) {
        for (int col = 0; col < terrain[row].length; col++) {
            if (terrain[row][col] < min) {
                min = terrain[row][col];
                minRow = row;
                minCole = col;
            }     
        }
    }
    if (minRow != -1 && minCol != -1) {
        terrain[minRow][minCol] *= -1;
    }
    return terrain;
}

getMinimumValueOfTerrain如果必须在 中重用现有方法,则应再次重新找到getMinimumValueOfTerrain该元素,并且可以应用嵌套循环之外的元素:minbreak

public static int[][] replaceMinusValue(int[][] terrain) {
    int min = getMinimumValueOfTerrain(terrain);

    out: 
    for (int row = 0; row < terrain.length; row++) {
        for (int col = 0; col < terrain[row].length; col++) {
            if (min == terrain[row][col]) {
                terrain[row][col] *= -1; // or -min
                break out;
            }    
        }
    }
    return terrain;
}
于 2021-01-25T19:57:18.860 回答