199. 判断连接
描述
给定二维整数数组arr以及整数k,确定是否arr中值为k的所有单元是否都连接在一起。 如果矩阵中的两个单元在水平或垂直方向上相邻且具有相同的值,则视为连接。
- ∣arr∣ ≤ 500
- |arr[i]∣ ≤ 500
- 0 <= arr[i][j] <= 100000
样例 1:
输入:
arr=[
[2,2,2,0],
[0,0,0,2],
[0,1,0,2],
[1,1,1,2]]
k=2
输出:
false
解释:
不是所有的`2`都相互连接
样例 2:
输入:
arr=[
[2,2,2,0],
[0,0,0,2],
[0,1,0,2],
[1,1,1,2]]
k=1
输出:
true
题解
public class Solution {
/**
* @param arr: the arr
* @param k: the k
* @return: if all instances of value k in arr are connected
*/
public boolean judgeConnection(int[][] arr, int k) {
// Write your code here.
int maxRow = arr.length;
int maxColumn = arr[0].length;
boolean found = false;
for (int r = 0; r < maxRow; ++r) {
for (int c = 0; c < maxColumn; ++c) {
if (arr[r][c] == k) {
if (found) {
return false;
} else {
found = true;
this.mark(arr, maxRow, maxColumn, r, c);
}
}
}
}
return true;
}
/**
* 标记
* @param arr
* @param maxRow
* @param maxColumn
* @param r
* @param c
*/
private void mark(int[][] arr, int maxRow, int maxColumn, int r, int c) {
int n = arr[r][c];
if (n >= 0) {
arr[r][c] = -1;
Queue<int[]> q = new LinkedList<>();
q.offer(new int[]{r, c});
final int[][] ps = new int[][]{new int[]{-1, 0}, new int[]{0, -1}, new int[]{1, 0}, new int[]{0, 1}};
while (!q.isEmpty()) {
int[] addr = q.poll();
for (int[] p : ps) {
int nr = addr[0] + p[0];
int nc = addr[1] + p[1];
if (nr >= 0 && nr < maxRow
&& nc >= 0 && nc < maxColumn
&& arr[nr][nc] == n) {
arr[nr][nc] = -1;
q.offer(new int[]{nr, nc});
}
}
}
}
}
}
最后说两句
非常感谢你阅读本文章,如果你觉得本文对你有所帮助,请留下你的足迹,点个赞,留个言,多谢~
作者水平有限,如果文章内容有不准确的地方,请指正。
希望小伙伴们都能每天进步一点点。
声明
本文由二当家的白帽子博客原创,转载请注明来源,谢谢~