所以我花了很长时间试图完善这个方法,但我无法让它发挥作用。我想做的是仅在 Java 中使用递归在不同整数的二维数组中找到峰值数。
基本上,我的方法是检查索引是否在数组内部,以及其上方、下方、左侧和右侧的数字是否大于当前数字.
如果是,则递归打印当前点并继续。但是,使用我编写的代码,该方法找到第一个路径,然后由于某种原因返回并找到不同的路径,这会产生问题,我只想要一个路径被打印,然后该方法需要停止。
我尝试输入一个 boolean 值来检查是否存在峰值,然后返回 true,但它仍然返回并打印其他路径。如果你们能帮助我,那就太棒了。
这是代码:
private static void printPath (int[][] mat, int i, int j) {
System.out.println("("+i+","+j+")");
if (i >=0 && i < mat.length-1 && mat[i][j] < mat[i+1][j]){
printPath(mat,i+1,j);
}
if (j >=0 && j < mat[0].length-1 && mat[i][j] < mat[i][j+1]){
printPath(mat,i,j+1);
}
if (i>0 && i < mat.length-1 && mat[i][j] < mat[i-1][j]){
printPath(mat,i-1,j);
}
if (j>0 && j < mat[0].length-1 && mat[i][j] < mat[i][j-1]){
printPath(mat,i,j-1);
}
}
最佳答案
为什么不改变整个算法?
通过依次附加包含
n
项的m
数组,将矩阵展平为m*n
大小的一维数组。使用简单的
max
算法来查找展平数组中峰值的索引。将展平数组中的索引转换为原始矩阵中的点:
i = index / m j = index % m
编辑
尝试在这些 if
之间放置 else
关键字:
private static void printPath (int[][] mat, int i, int j) {
System.out.println("("+i+","+j+")");
if (i >=0 && i < mat.length-1 && mat[i][j] < mat[i+1][j]){
printPath(mat,i+1,j);
} else if (j >=0 && j < mat[0].length-1 && mat[i][j] < mat[i][j+1]){
printPath(mat,i,j+1);
} else if (i>0 && i < mat.length-1 && mat[i][j] < mat[i-1][j]){
printPath(mat,i-1,j);
} else if (j>0 && j < mat[0].length-1 && mat[i][j] < mat[i][j-1]){
printPath(mat,i,j-1);
}
}
但我仍然不确定该算法 - 这将能够找到局部峰值,但不能找到全局峰值 - 想象有一个项目的所有邻居都低于其自身,但在矩阵的其他地方可能有甚至更大的数字。您的算法将停止在此项上,即使它不是最大的一项。
关于java - 如何在二维数组中查找峰值中停止Java递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48280166/