1.タイトルの説明
am * n整数行列グリッドとして表されるサーバーセンターのマップが表示されます。1はそのセルにサーバーがあることを意味し、0はサーバーがないことを意味します。2つのサーバーが同じ行または同じ列にある場合、それらは通信すると言われています。
他のサーバーと通信するサーバーの数を返します。
Input: grid = [[1,1,0,0],[0,0,1,0],[0,0,1,0],[0,0,0,1]]
Output: 4
第二に、解決策
方法1:列挙
- 2台以上のコンピューターが相互に通信するには、同じ行と列にある必要があります。
- つまり、特定の場所の行と列にPCが1つしかない場合、それらは互いに通信できません。
public int countServers(int[][] grid) {
int R = grid.length, C = grid[0].length;
int[] row = new int[R];
int[] col = new int[C];
int res = 0;
for (int x = 0; x < R; x++)
for (int y = 0; y < C; y++) {
if (grid[x][y] == 1) {
row[x]++; col[y]++;
res++;
}
}
for (int x = 0; x < R; x++)
for (int y = 0; y < C; y++) {
if (grid[x][y] == 1 && row[x] == 1 && col[y] == 1) {
res--;
}
}
return res;
}
複雑さの分析
- 時間の複雑さ: 、
- スペースの複雑さ: 、
方法2:チェック
- 特定のグリッドが検出された場合は、それが存在する行と列をマージします
count++
。 - 最後に、並列検索セットufの特定のノードの下で子を1つだけ見つけます。ある場合は、このpcが独立して
count--
いることを証明します。
質疑応答
- Q1:行と列がマージされるのはなぜ
union(i, j+row)
ですか?
A1、誤った解釈:長方形にはm行とn列がありますが、チェックセットのid配列には1行しかないため、 それがどこ配列ID値は、示されている表すj + m
配列インデックスIDのi番目の行のj番目の列を表します。
int R, C;
public int countServers(int[][] grid) {
R = grid.length; C = grid[0].length;
int tot = 0;
UF uf = new UF(R + C);
for (int i = 0; i < R; i++)
for (int j = 0; j < C; j++) {
if (grid[i][j] == 1) {
tot++;
uf.union(i, j+R);
}
}
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < R; i++)
for (int j = 0; j < C; j++) {
if (grid[i][j] == 1) {
int p = uf.find(i);
map.put(p, map.getOrDefault(p, 0)+1);
}
}
for (int k : map.keySet()) {
if (map.get(k) == 1)
tot--;
}
return tot;
}
class UF {
int[] id;
int count;
public UF(int N) {
id = new int[N];
for (int i = 0; i < N; i++) {
id[i] = i;
}
}
public int find(int p) {
while (p != id[p]) {
p = id[p];
}
return p;
}
public boolean isConn(int p, int q) {
return find(p) == find(q);
}
public void union(int p, int q) {
int pID = find(p);
int qID = find(q);
if (pID == qID) {
return;
}
id[pID] = qID;
count--;
}
}
複雑さの分析
- 時間の複雑さ: 、
- スペースの複雑さ: 、