我需要一种快速方法来检查2d数组是否完全相邻,这意味着所有值都与其他相同的值相邻。相邻意味着四个主要方向。
This would be an adjacent array
[1 1 2]
[1 2 2]
[3 3 3]
This isn't
[1 2 1]
[1 2 2]
[3 3 3]
This is
[1 2 4]
[1 2 2]
[3 3 3]
到目前为止,我已经尝试了一种O(M * N)方法,我遍历整个数组并检查至少有一个邻居是否是相同的值。我正在寻找一种可能更快的方式。
编辑:刚注意到我的方法甚至无法正常工作。例如:This should fail (not all of the 1s are adjacent)
[1 2 1]
[1 2 1]
[3 3 3]
所以现在我需要一个实际的算法。
答案 0 :(得分:1)
因为,我认为,类似的值可以任意相距很远,并且可以采用任何形状,在矩阵中我不知道如何在不首先计算值的连通分量:< / p>
答案 1 :(得分:1)
我想起了Minesweeper游戏。
外循环:扫描整个阵列(逐行,从左到右)。 这是为了找到内循环的下一个位置。如果我们有 没有从内循环访问这个位置,并且数字在 这个位置还没有被看到,在此开始内循环 位置。如果我们已经看到了这个位置的数字,那么 矩阵不是“相邻的”。
内循环:查找具有相同编号和标记的所有相邻单元格 他们如访问(扫雷部分)。将此数字记录为 访问并返回外部循环。
这需要一个布尔矩阵显示“已访问”位置(与正在扫描的数组大小相同)和一个已被“访问”的布尔数字[1..n]列表。
答案 2 :(得分:0)
我只想提一下,你不能创建一个比O(M*N)
好的算法(当然这是最坏的情况),因为在最坏的情况下你将不得不访问所有的元素。
正如您所说的O(M*N)
算法不适用于所有情况,您可以使用BFS和Time complexity is O(M*N)
if(no.of connected components == no.of distinct elements) {
return true;
}else{
return false;
}
您如何找到连接组件的数量?
yourFunction(int[][] matrix){
boolean visited[][];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(!visited[i][j]){
BFS(matrix,i,j);
connectedComponents++;
}
}
}
int distinctNumbers = findDistinctNumbers(matrix); // you can write this function easily.
}
void BFS(int[][] martix, int i,int j){
queue<Point> queue = new LinkedList<>();
queue.add(new Point(i,j));
while(queue.isEmpty()){
Point point = queue.poll();
for each neighbour of point
if neighbour is not visited && neighbour value =current point value
add neighbour to queue;
}
}