不带权并查集问题
class Solution {
public boolean equationsPossible(String[] equations) {
int[] parent = new int[26];
for (int i = 0; i < 26; i++) {
parent[i] = i;
}
for (String s : equations) {
if (s.charAt(1) == '=') {
int index1 = s.charAt(0) - 'a';
int index2 = s.charAt(3) - 'a';
union(parent, index1, index2);
}
}
for (String s : equations) {
if (s.charAt(1) == '!') {
int index1 = s.charAt(0) - 'a';
int index2 = s.charAt(3) - 'a';
if (find(parent, index1) == find(parent, index2)) {
return false;
}
}
}
return true;
}
public void union(int[] parent, int index1, int index2) {
parent[find(parent, index1)] = find(parent, index2);
}
public int find(int[] parent, int index) {
while (index != parent[index]) {
parent[index] = parent[parent[index]];
index = parent[index];
}
return index;
}
}
方法一:并查集
class Solution {
public int findCircleNum(int[][] isConnected) {
int n = isConnected.length;
int[] parent = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (isConnected[i][j] == 1) {
union(parent, i, j);
}
}
}
int provinces = 0;
for (int i = 0; i < n; i++) {
if (parent[i] == i) {
provinces++;
}
}
return provinces;
}
public void union(int[] parent, int i, int j) {
parent[find(parent, i)] = find(parent, j);
}
public int find(int[] parent, int index) {
while (parent[index] != index) {
parent[index] = parent[parent[index]];
index = parent[index];
}
return index;
}
}
方法二:深度优先
class Solution {
public int findCircleNum(int[][] isConnected) {
int res = 0;
int n = isConnected.length;
boolean[] visited = new boolean[n];
for (int i = 0; i < n; i++) {
if (!visited[i]) {
dfs(isConnected, visited, n, i);
res++;
}
}
return res;
}
public void dfs(int[][] isConnected, boolean[] visited, int n, int i) {
for (int j = 0; j < n; j++) {
if (isConnected[i][j] == 1 && !visited[j]) {
visited[j] = true;
dfs(isConnected, visited, n, j);
}
}
}
}
方法三:广度优先
class Solution {
public int findCircleNum(int[][] isConnected) {
int res = 0;
int n = isConnected.length;
boolean[] visited = new boolean[n];
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < n; i++) {
if (!visited[i]) {
queue.offer(i);
while (!queue.isEmpty()) {
int k = queue.poll();
visited[k] = true;
for (int j = 0; j < n; j++) {
if (isConnected[k][j] == 1 && !visited[j]) {
queue.offer(j);
}
}
}
res++;
}
}
return res;
}
}
class Solution {
public int[] findRedundantConnection(int[][] edges) {
int n = edges.length;
int[] parent = new int[n + 1];
for (int i = 1; i <= n; i++) {
parent[i] = i;
}
for (int[] edge : edges) {
int node1 = edge[0];
int node2 = edge[1];
if (find(parent, node1) == find(parent, node2)) {
return edge;
} else {
union(parent, node1, node2);
}
}
return new int[0];
}
public void union(int[] parent, int node1, int node2) {
parent[find(parent, node1)] = find(parent, node2);
}
public int find(int[] parent, int node) {
while (node != parent[node]) {
parent[node] = parent[parent[node]];
node = parent[node];
}
return node;
}
}
深度优先或者广度优先都可以,并查集太麻烦
深度优先:
class Solution {
void dfs(char[][] grid, int r, int c) {
int nr = grid.length;
int nc = grid[0].length;
if (r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0') {
return;
}
grid[r][c] = '0';
dfs(grid, r - 1, c);
dfs(grid, r + 1, c);
dfs(grid, r, c - 1);
dfs(grid, r, c + 1);
}
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int nr = grid.length;
int nc = grid[0].length;
int num_islands = 0;
for (int r = 0; r < nr; ++r) {
for (int c = 0; c < nc; ++c) {
if (grid[r][c] == '1') {
num_islands++;
dfs(grid, r, c);
}
}
}
return num_islands;
}
}
广度优先:
class Solution {
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int nr = grid.length;
int nc = grid[0].length;
int num_islands = 0;
for (int r = 0; r < nr; ++r) {
for (int c = 0; c < nc; ++c) {
if (grid[r][c] == '1') {
num_islands++;
grid[r][c] = '0';
Queue<int[]> neighbors = new LinkedList<>();
neighbors.offer(new int[]{r, c});
while (!neighbors.isEmpty()) {
int[] rc = neighbors.poll();
int row = rc[0];
int col = rc[1];
if (row - 1 >= 0 && grid[row - 1][col] == '1') {
neighbors.offer(new int[]{row - 1, col});
grid[row - 1][col] = '0';
}
if (row + 1 < nr && grid[row + 1][col] == '1') {
neighbors.offer(new int[]{row + 1, col});
grid[row + 1][col] = '0';
}
if (col - 1 >= 0 && grid[row][col - 1] == '1') {
neighbors.offer(new int[]{row, col - 1});
grid[row][col - 1] = '0';
}
if (col + 1 < nc && grid[row][col + 1] == '1') {
neighbors.offer(new int[]{row, col + 1});
grid[row][col + 1] = '0';
}
}
}
}
}
return num_islands;
}
}
方法一:并查集
class Solution {
public int makeConnected(int n, int[][] connections) {
if (connections.length < n - 1) {
return -1;
}
int[] parent = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
}
for (int[] connection : connections) {
int node1 = connection[0];
int node2 = connection[1];
if (find(parent, node1) != find(parent, node2)) {
union(parent, node1, node2);
}
}
int circles = 0;
for (int i = 0; i < n; i++) {
if (parent[i] == i) {
circles++;
}
}
return circles - 1;
}
public void union(int[] parent, int node1, int node2) {
parent[find(parent, node1)] = find(parent, node2);
}
public int find(int[] parent, int node) {
while (node != parent[node]) {
parent[node] = parent[parent[node]];
node = parent[node];
}
return node;
}
}
方法二:深度优先
先构建邻接表
class Solution {
public int makeConnected(int n, int[][] connections) {
if (connections.length < n - 1) {
return -1;
}
ArrayList[] edges = new ArrayList[n];
for (int i = 0; i < n; i++) {
edges[i] = new ArrayList<Integer>();
}
for (int[] connection : connections) {
edges[connection[0]].add(connection[1]);
edges[connection[1]].add(connection[0]);
}
boolean[] visited = new boolean[n];
int res = 0;
for (int i = 0; i < n; i++) {
if (!visited[i]) {
res++;
dfs(visited, edges, i);
}
}
return res - 1;
}
public void dfs(boolean[] visited, ArrayList<Integer>[] edges, int i) {
visited[i] = true;
for (int x : edges[i]) {
if (!visited[x]) {
dfs(visited, edges, x);
}
}
}
}
带权并查集问题(更难)
在这里插入代码片