Se colocan n piedras en algunos puntos de coordenadas enteras en un plano bidimensional. Puede haber como máximo una piedra en cada punto de coordenadas.
Si hay otras piedras en la misma fila o en la misma fila de una piedra, entonces la piedra se puede quitar.
Le da una matriz de piedras de longitud n, donde piedras [i] = [xi, yi] representa la posición de la i-ésima piedra, y devuelve el número máximo de piedras que se pueden quitar.
Ejemplo 1:
Entrada: piedras = [[0,0], [0,1], [1,0], [1,2], [2,1], [2,2]]
Salida: 5
Explicación: Una eliminación El método de 5 piedras es la siguiente:
- Quite la piedra [2,2] porque es lo mismo que [2,1].
- Quite la piedra [2,1] porque está en la misma columna que [0,1].
- Quite la piedra [1,2] porque va con [1,0].
- Quite la piedra [1,0] porque está en la misma columna que [0,0].
- Retire la piedra [0,1] porque es lo mismo que [0,0].
La piedra [0,0] no se puede quitar porque no está en línea / columna con otra piedra.
Ejemplo 2:
Entrada: piedras = [[0,0], [0,2], [1,1], [2,0], [2,2]]
Salida: 3
Explicación: Un método para quitar 3 piedras es el siguiente. :
- Quite la piedra [2,2] porque es lo mismo que [2,0].
- Quite la piedra [2,0] porque está en la misma columna que [0,0].
- Retire la piedra [0,2] porque es lo mismo que [0,0].
Las piedras [0,0] y [1,1] no se pueden quitar porque no están en línea / columna con otra piedra.
Ejemplo 3:
Entrada: piedras = [[0,0]]
Salida: 0
Explicación: [0,0] es la única piedra en el plano, por lo que no se puede quitar.
rápido:
1 <= piedras.longitud <= 1000
0 <= xi, yi <= 104
No habrá dos piedras colocadas en el mismo punto de coordenadas
Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/most-stones-removed-with-same-row-or-column
Copyright es propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.
Idea: La búsqueda de sindicatos tiene dos conjuntos de plantillas, un conjunto de mapas y un conjunto de matrices (de hecho, todos son de la misma naturaleza).
public class Solution {
public int removeStones(int[][] stones) {
UnionFind unionFind = new UnionFind();
for (int[] stone : stones) {
// 下面这三种写法任选其一
// unionFind.union(~stone[0], stone[1]);
// unionFind.union(stone[0] - 10001, stone[1]);
unionFind.union(stone[0] + 10001, stone[1]);
}
return stones.length - unionFind.getCount();
}
}
class UnionFind{
private Map<Integer,Integer> parent;
private int count;
public UnionFind(){
this.parent = new HashMap<>();
this.count = 0;
}
public int getCount(){
return count;
}
public int find(int x){
if(!parent.containsKey(x)){
parent.put(x,x);
count++;
}
if(x!=parent.get(x)){
parent.put(x,find(parent.get(x)));
}
return parent.get(x);
}
public void union(int x,int y){
int rootX = find(x);
int rootY = find(y);
if(rootX==rootY){
return;
}
parent.put(rootX,rootY);
count--;
}
}