请用Java编写一个方法,它将接收矩阵(int [] []矩阵)作为输入,并且应该从矩阵中找到所有局部最大值。局部最大值是矩阵中的这个数字,它大于其所有直接邻居。该方法应返回找到的所有本地最大数字的位置列表。
我试过这个代码来做这个但不知道这个想法是否正确代码
private static List<Integer> findLocal(int[][] matrix)
{
List<Integer> locals = new ArrayList<Integer>();
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (i < matrix.length - 1 && j < matrix[0].length - 1) {
if (matrix[i][j] < matrix[i + 1][j] && matrix[i][j] < matrix[i][j + 1] && matrix[i][j] < matrix[i + 1][j + 1]) {
locals.add(i + j);
} else {
}
}
}
}
return locals;
}
答案 0 :(得分:2)
好的,现在看来你已经有了一个想法,这基本上是一个有用的想法。
它只有一个缺陷:你所看到的neigborhood是错误的:对于一个点(i,j),(von Neumann)邻居是(i + 1,j),(i,j + 1),( i-1,j)和(i,j-1)。
所以,当你检查这一点时,它应该在一般工作,但是:你必须特别注意边界。由于你没有第-1列,没有第n + 1列/行,当你在那里时,不考虑那个邻居点。你如何处理它,取决于你想如何对待它:如果邻域环绕,边界是否有一个常数值,它应该被视为-infty吗?
答案 1 :(得分:2)
你写
if (matrix[i][j] < matrix[i + 1][j]
&& matrix[i][j] < matrix[i][j + 1]
&& matrix[i][j] < matrix[i + 1][j + 1]) {
检查元素是否小于其三个邻居。其他五个邻居怎么样?我们也检查一下:
if (matrix[i][j] < matrix[i + 1][j]
&& matrix[i][j] < matrix[i+1][j-1]
&& matrix[i][j] < matrix[i+1][j+1]
&& matrix[i][j] < matrix[i][j + 1]
&& matrix[i][j] < matrix[i][j - 1]
&& matrix[i][j] < matrix[i-1][j-1])
&& matrix[i][j] < matrix[i-1][j])
&& matrix[i][j] < matrix[i-1][j+1]) {
这假设您要检查元素的8个直接邻居,即直线和对角线。如果这不是您想要的,请调整。
还要求找到局部最大值。这标识了本地最小值。将<
更改为>
。
另一件事是locals.add(i + j)
没有做你认为它做的事情。如果元素(i = 3,j = 4)是局部最大值,那么你就说locals.add(7)
,这显然不是你想要的。
答案 2 :(得分:1)
我认为不需要对每个矩阵进行8次比较 元件。你应该采取两个额外的阵列:
MATRIX[n+2][n+2]
:它将包含一个额外的输入矩阵
所有INT_MIN的层(因此,每个矩阵元素都有8个
邻居)。
Mark[n+2][n+2] = {0}
(您只需要访问中的元素
未标记的输入矩阵)如果是矩阵元素
声明为局部最小值,你应该标记它的所有邻居
Mark [] [] vector。
通过这样做,复杂性将保持为O(n ^ 2)但不是。比较会 最小化。
答案 3 :(得分:0)
您必须分别存储i和j才能正确记住元素的位置。因此,
List<Integer> locals = new ArrayList<Integer>();
不起作用。 你可以用
List<Integer[]> locals = new ArrayList<Integer[]>();
代替。要添加新找到的本地最大值的位置,请使用
Integer[] localMax = {i, j};
locals.add(localMax);