使用蛮力在方形二维阵列中找到峰值的最简单或最佳方法是什么?

What is the easiest or best way to find the peak in a square 2D array using brute force?

我想在包含随机值的 x 行 x 列的方形二维数组中找到峰值,峰值应该是数组中的最大值并且还高于它的 4 个邻居,北,南,西,东。

蛮力表明您只是遍历数组以查看每一种可能性。如果是这种情况,您应该只查看数组中的每个值。此外,如果该值是数组中的最高值,则该值保证高于其邻居。如果你想找到数组中的位置,你可以做类似下面的事情。

编辑:由于 OP 指定峰值必须 高于 比任何邻居,你必须为北添加一个参数,南、东、西。您只需更改 if 语句。您会注意到,我还检查了 xy 循环的位置,因为对于北方来说,如果 y == 0,那么就没有过去的行,所以我们不应该进一步检查我们正在测试的峰值的北部。更新以下内容:

// changing test case. The new answer will be 4:
int[][] array = {{2, 3, 4, 6},
                 {4, 3, 9, 9},
                 {3, 2, 1, 5}};

int maxX = 0, maxY = 0; // the location of maximum value to start
int maxFound = 0; // assuming positive values

for (int x = 0; x < array.length; x++) {
    for (int y = 0; y < array[x].length; y++) {
    
        // if current value in array at (x, y) is greater than maxFound,
        // update maxFound, maxX, and maxY:
        if (maxFound < array[x][y] &&
            (x == 0 || (array[x - 1][y] < array[x][y])) && // WEST
            (y == 0 || (array[x][y - 1] < array[x][y])) && // NORTH
            (x == array.length - 1 || (array[x + 1][y] < array[x][y])) && // EAST
            (y == array[x].length - 1 || (array[x][y + 1] < array[x][y]))) {
            maxFound = array[x][y];
            maxX = x;
            maxY = y;
        }
    }
}

System.out.println("The max was: " + maxFound + " at position: " + maxX + " " + maxY);

我不确定这是否是您想要的,但线性搜索未排序的数组不一定蛮力。无论哪种方式,你都必须查看二维数组中的每个值,所以如果你想知道复杂性,线性 O(n) 其中 n = array.length * array[0].length 尽可能快,除非二维数组在在我们开始使用它之前,一些更有序的结构。

试试这个。

public static void main(String[] args) {
    int[][] matrix = {{ 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }};
    int peak = Stream.of(matrix)
        .flatMapToInt(row -> IntStream.of(row))
        .max().getAsInt();
    System.out.println(peak);
};

输出:

8