需要帮助迭代在较大的二维数组中找到的较小的二维 "subarrays"

Need help iterating through smaller 2D "subarrays" found in larger 2D array

我正在开展一个项目,该项目需要找到包含在较大二维整数数组中的一些较小二维整数数组。

更具体地说,我会得到一个文本文件供我输入。文本文件将包含 N、M 和 K 值,以及用于填充 "large" MxN 网格的整数。然后我需要在那个更大的 MxN 网格中找到所有 "small" KxK 网格,并且 return 在每个 KxK 网格中找到最大的整数。

因此,例如: 米 = 3; n = 4; k = 2

MxN:
3 4 2
2 3 1
8 3 2
7 8 1

要分析的第一个 KxK 网格是:
3 4
2 3
return4;

第二个:
4 2
3 1
return4;

第三个:
2 3
8 3
return8;

等等等等

是否有一种巧妙的方法可以使用 mod 运算符或其他方式遍历这些 KxK 网格?我觉得对此有一个简单的解决方案,但对我来说并不明显。

我知道这与其说是编程问题,不如说是数学问题,但我们将不胜感激。

谢谢。

鉴于 K<=N && K<=M,您可以通过将左上角从 0,0 移动到 N-K,M-K(循环使用 2)来轻松找到所有 subarray2d

然后创建一个函数,获取 K*K subarray2d 左上角的坐标并返回其较高的值:)

我试着在这里写了一些代码:

private int[] getMaxFromGrids(int k, int[][] yourArray){

    int m = yourArray.length;    //height of grid
    int n = yourArray[0].length; //width of grid, assuming that all inner array have same length!
                                 //argument k is size of smaller grid

    //computing max possibilities to fit smaller grid to larger one
    int maxPossibilities = (m - k + 1) * (n - k + 1);

    if(maxPossibilities < 1 || k < 1) return null;

    int[] maxValuesSmallGrid = new int[maxPossibilities];
    for (int i = 0; i < (maxPossibilities); i++) {

        //computing actual start element for small grid
        int colStartElement = i % (n - (k - 1));
        int rowStartElement = i / (n - (k - 1));

        //creating smaller grid
        int[] smallGrid = new int[k * k];
        int o = 0; //index of smaller grid
        for (int j = colStartElement; j < colStartElement + k; j++) {
            for (int l = rowStartElement; l < rowStartElement + k; l++) {
                smallGrid[o++] = yourArray[j][l];
            }
        }

        maxValuesSmallGrid[i] = getMax(smallGrid);
    }

    return maxValuesSmallGrid;
}

//method for getting max number from given array
private int getMax(int[] numbers) {
    int max = Integer.MIN_VALUE;
    for(int num : numbers) {
        if(num > max) max = num;
    }
    return max;
}