【发布时间】:2019-08-27 21:58:44
【问题描述】:
问题
给定一个二维数组(矩阵),其高度和宽度可能不相等,仅包含 0 和 1。每个 0 代表土地,每个 1 代表河流的一部分。一条河流由任意数量的 1 组成,这些 1 水平或垂直相邻(但不是对角相邻)。形成一条河流的相邻 1 的数量决定了它的大小。编写一个函数,返回一个数组,该数组包含输入矩阵中表示的所有河流的大小。请注意,这些尺寸不需要按任何特定顺序排列。
Input
[
[1,0,0,1,0],
[1,0,1,0,0],
[0,0,1,0,1],
[1,0,1,0,1],
[1,0,1,1,0],
]
Output [1,2,2,2,5]
我的方法
在评估了问题后,我觉得这应该使用图遍历之类的算法来完成,可能是深度优先搜索。所以这正是我所做的。
我从左上角遍历矩阵,看看值是否被访问,如果不是,如果值为 1,那么我遍历它的所有节点并保留一个计数器以保持河流的大小。最后,我用河流的总大小更新了一个数组列表。
由于某种原因,我的结果不正确,我不确定我做错了什么。我也手动跟踪了我的代码,但无法找出问题所在。
我的代码
import java.util.ArrayList;
class Program {
public static ArrayList<Integer> riverSizes(int[][] matrix) {
ArrayList<Integer> result = new ArrayList<Integer>();
boolean [][] visitStatus = new boolean [matrix.length][matrix[0].length];
for(int row = 0; row<matrix.length; row++){
for(int col = 0; col<matrix.length; col++){
int count = 0;
count = traverseMatrix(row,col,matrix,visitStatus,count);
result.add(count);
}
}
return result;
}
public static int traverseMatrix(int row, int col, int [][] matrix, boolean [][] visitStatus, int count){
if(visitStatus[row][col] == true){
return count;
}else if(matrix[row][col] == 0){
visitStatus[row][col] = true;
return count;
}else{
count++;
visitStatus[row][col] = true;
if(isValid(row,col-1,matrix)){
return traverseMatrix(row,col-1,matrix,visitStatus,count);
}
if(isValid(row,col+1,matrix)){
return traverseMatrix(row,col+1,matrix,visitStatus,count);
}
if(isValid(row-1,col,matrix)){
return traverseMatrix(row-1,col,matrix,visitStatus,count);
}
if(isValid(row+1,col,matrix)){
return traverseMatrix(row+1,col,matrix,visitStatus,count);
}
}
return count;
}
public static boolean isValid(int row, int col,int[][] matrix){
return (row >= 0 && row < matrix.length) && (col >= 0 && col < matrix[0].length);
}
}
【问题讨论】:
-
在调试中运行你的测试,你会看到你的循环很快就无法检查整个数组
标签: java algorithm data-structures depth-first-search