使用并查集解决的相关问题
2022/6/4 23:50:07
本文主要是介绍使用并查集解决的相关问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
作者: Grey
原文地址:使用并查集解决的相关问题
关于并查集的说明,见如下博客:
使用并查集处理集合的合并和查询问题
相关题目
LeetCode 200. 岛屿数量
本题的解题思路参考博客
使用DFS和并查集方法解决岛问题
LeetCode 547. 省份数量
主要思路
横纵坐标表示的是城市,因为城市是一样的,所以只需要遍历对角线上半区或者下半区即可,如果某个(i,j)
位置是1
,可以说明如下两个情况
第一,i
这座城市和j
这座城市可以做union
操作。
第二,(j,i)
位置一定也是1。
遍历完毕后,返回整个并查集中的集合数量即可。
完整代码
public static int findCircleNum(int[][] m) { int n = m.length; UF uf = new UF(n); for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (m[i][j] == 1) { uf.union(i, j); } } } return uf.setSize(); } public static class UF { int[] parent; int[] help; int[] size; int sets; public UF(int n) { size = new int[n]; parent = new int[n]; help = new int[n]; for (int i = 0; i < n; i++) { parent[i] = i; size[i] = 1; } sets = n; } public void union(int i, int j) { if (i == j) { return; } int p1 = find(i); int p2 = find(j); if (p2 != p1) { int size1 = size[p1]; int size2 = size[p2]; if (size1 > size2) { parent[p2] = p1; size[p1] += size2; } else { parent[p1] = p2; size[p2] += size1; } sets--; } } public int find(int i) { int hi = 0; while (i != parent[i]) { help[hi++] = i; i = parent[i]; } for (int index = 0; index < hi; index++) { parent[help[index]] = i; } return i; } public int setSize() { return sets; } }
待更新...
更多
算法和数据结构笔记
这篇关于使用并查集解决的相关问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南