LeetCode Number of Connected Components in an Undirected Graph
原题链接在这里:https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/
题目:
Given n
nodes labeled from 0
to n - 1
and a list of undirected edges (each edge is a pair of nodes), write a function to find the number of connected components in an undirected graph.
Example 1:
- 0 3
- | |
- 1 --- 2 4
Given n = 5
and edges = [[0, 1], [1, 2], [3, 4]]
, return 2
.
Example 2:
- 0 4
- | |
- 1 --- 2 --- 3
Given n = 5
and edges = [[0, 1], [1, 2], [2, 3], [3, 4]]
, return 1
.
Note:
You can assume that no duplicate edges will appear in edges
. Since all edges are undirected, [0, 1]
is the same as [1, 0]
and thus will not appear together in edges
.
题解:
使用一维UnionFind.
Time Complexity: O(elogn). e是edges数目. Find, O(logn). Union, O(1).
Space: O(n).
AC Java:
- class Solution {
- public int countComponents(int n, int[][] edges) {
- if(n <= 0){
- return 0;
- }
- UnionFind uf = new UnionFind(n);
- for(int [] edge : edges){
- if(!uf.find(edge[0], edge[1])){
- uf.union(edge[0], edge[1]);
- }
- }
- return uf.size();
- }
- }
- class UnionFind{
- private int count;
- private int [] parent;
- private int [] size;
- public UnionFind(int n){
- this.count = n;
- parent = new int[n];
- size = new int[n];
- for(int i = 0; i<n; i++){
- parent[i] = i;
- size[i] = 1;
- }
- }
- public boolean find(int i, int j){
- return root(i) == root(j);
- }
- private int root(int i){
- while(i != parent[i]){
- parent[i] = parent[parent[i]];
- i = parent[i];
- }
- return parent[i];
- }
- public void union(int i, int j){
- int rootI = root(i);
- int rootJ = root(j);
- if(size[rootI] > size[rootJ]){
- parent[rootJ] = rootI;
- size[rootI] += size[j];
- }else{
- parent[rootI] = rootJ;
- size[rootJ] += size[rootI];
- }
- this.count--;
- }
- public int size(){
- return this.count;
- }
- }
也可以使用BFS, DFS.
Time Complexity: O(n+e), 建graph用O(n+e), BFS, DFS 用 O(n+e). Space: O(n + e).
- public class Solution {
- public int countComponents(int n, int[][] edges) {
- List<List<Integer>> graph = new ArrayList<List<Integer>>();
- for(int i = 0; i<n; i++){
- graph.add(new ArrayList<Integer>());
- }
- for(int [] edge : edges){
- graph.get(edge[0]).add(edge[1]);
- graph.get(edge[1]).add(edge[0]);
- }
- HashSet<Integer> visited = new HashSet<Integer>();
- int count = 0;
- for(int i = 0; i<n; i++){
- if(!visited.contains(i)){
- // bfs(graph, i, visited);
- dfs(graph, i, visited);
- count++;
- }
- }
- return count;
- }
- public void bfs(List<List<Integer>> graph, int i, HashSet<Integer> visited){
- LinkedList<Integer> que = new LinkedList<Integer>();
- visited.add(i);
- que.add(i);
- while(!que.isEmpty()){
- int cur = que.poll();
- List<Integer> neighbours = graph.get(cur);
- for(int neighbour : neighbours){
- if(!visited.contains(neighbour)){
- que.add(neighbour);
- visited.add(neighbour);
- }
- }
- }
- }
- public void dfs(List<List<Integer>> graph, int i, HashSet<Integer> visited){
- visited.add(i);
- for(int neighbour : graph.get(i)){
- if(!visited.contains(neighbour)){
- dfs(graph, neighbour, visited);
- }
- }
- }
- }
跟上Find the Weak Connected Component in the Directed Graph, Number of Islands II.
LeetCode Number of Connected Components in an Undirected Graph的更多相关文章
- [LeetCode] Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
- LeetCode 323. Number of Connected Components in an Undirected Graph
原题链接在这里:https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/ 题目: Giv ...
- [LeetCode] 323. Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
- 323. Number of Connected Components in an Undirected Graph (leetcode)
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
- Number of Connected Components in an Undirected Graph -- LeetCode
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
- 【LeetCode】323. Number of Connected Components in an Undirected Graph 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 并查集 日期 题目地址:https://leetcod ...
- [Swift]LeetCode323. 无向图中的连通区域的个数 $ Number of Connected Components in an Undirected Graph
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
- [Locked] Number of Connected Components in an Undirected Graph
Number of Connected Components in an Undirected Graph Given n nodes labeled from 0 to n - 1 and a li ...
- 323. Number of Connected Components in an Undirected Graph按照线段添加的并查集
[抄题]: Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of n ...
随机推荐
- Web App开发入门
WebApp与Native App有何区别呢? Native App: 1.开发成本非常大.一般使用的开发语言为JAVA.C++.Objective-C. 2.更新体验较差.同时也比较麻烦.每一次发布 ...
- Scheduled Projects
Plans as at 10/03/15 ASB --------> Li ...
- exp.validate.js
简单实用的js基础数据验证 prototype /// <reference path="/Scripts/expand-fn/exp_validate.js" /> ...
- 热烈祝贺华清远见《ARM处理器开发详解》第2版正式出版
2014年6月,由华清远见研发中心组织多名业 内顶尖讲师编写的<ARM处理器开发详解>一书正式出版.本书以S5PV210处理器为平台,详细介绍了嵌入式系统开发的各个主要环节,并注重实践,辅 ...
- OO与设计模式的原则、目标
OO与设计模式的原则.目标(转) 前两天,和一朋友聊到OO设计原则时,对设计模式有了更深的了解,在这里总结一下,与大家分享.OO(Object–Oriented )面向对象 OO方法(Object ...
- php在window下的环境配置(VC9)
配置PHP5: 1. 配置PHP5.3.3,打开php安装目录(笔者是D:\php\php5)可以看到目录下有两个这样的文件php.ini- development和php.ini-produ ...
- Update UI from an asynchronous thread
One of the most common tasks you need to perform in a Windows Phone application is updating the UI f ...
- 一个网页抓取的类支持get+post+cookie存储
前段时间提取了一个工具类,分享给大家: <?php class httpconnector { private $curl; private $cookie; private $kv; func ...
- scala 代码随笔
def myfunc[T](iter: Iterator[T]) : Iterator[(T, T)] = { var res = List[(T, T)]() var pre = iter.next ...
- HTML 5 服务器发送事件
接收 Server-Sent 事件通知 EventSource 对象用于接收服务器发送事件通知: 实例 var source=new EventSource("demo_sse.php&qu ...