leetcode 547朋友圈
2024-10-06 20:38:22
方法一:染色法
类似于岛屿的个数也可以用染色法:通过深度优先搜索来做
使用一个数组来表示当前朋友a是否已经包含到已经遍历的朋友圈中,遍历所有的朋友,如果当前朋友没有在已经访问的朋友圈中,即visited==false,那么cnt++;并将该朋友所有相关的朋友使用dfs全部标记为visited=true;
当遍历完成时,cnt即为结果;并且不改变原数组,时间复杂度O(n^2),即遍历M的每个元素;空间复杂度为O(n);
C++代码:
class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
int m=M.size();
if(m==) return ;
int cnt=;
vector<bool>visited(m,false);
for(int i=;i<m;i++){
if(!visited[i]){
dfs(M,visited,i);
cnt++;
}
}
return cnt;
}
void dfs(vector<vector<int>>&M,vector<bool>&visited,int i){
int m=M.size();
for(int j=;j<m;j++){
if(M[i][j]== && !visited[j]){
visited[j]=true;
dfs(M,visited,j);
}
}
}
};
方法二:并查集
//使用并查集,基本思想是假设所有人都独立,初始化朋友圈为n个,如果两个人相关那么n--,将所有人遍历可得到朋友圈个数;
class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
int n=M.size();
if(n==) return ;
int groups=n;
vector<int>leads(n,);
for(int i=;i<n;i++) leads[i]=i;
for(int i=;i<n;i++){
for(int j=i+;j<n;j++){
if(M[i][j]==){
int lead1=find(i,leads);
int lead2=find(j,leads);
if(lead1!=lead2){
groups--;leads[lead1]=lead2;
}
}
}
}
return groups;
}
private:
int find(int x,vector<int>&parents){
if(x==parents[x])
return x;
else
return find(parents[x],parents);
}
};
最新文章
- Android权限管理之Android 6.0运行时权限及解决办法
- 删除 Windows 旧 OS 加载器
- Memcache之内存分配机制
- [原]Jenkins(一)---我理解的jenkins是这样的
- HTML的超链接
- 【转】CSS white-space 属性
- UVa 10294 (P&#243;lya计数) Arif in Dhaka (First Love Part 2)
- gentoo
- POJ 3017 单调队列dp
- HttpGet和HttpPost的区别
- PHP基础入门详解(一)【世界上最好用的编程语言】
- vue中简单的小插曲
- 0011 删除链表的倒数第N个节点
- BeanUtils.copyProperties(A,B)使用注意事项
- python 生成器按指定大小读取文件
- PCL(Point Cloud Library)的第三方库简单介绍(boost,eigen,flann,vtk,qhull)
- 解决Linux SSH登录慢
- OpenStack入门篇(八)之镜像服务Glance
- Linux下TC使用说明 &; 使用备注 ZZ
- jeecg3.7中弹出窗操作标签dgOpenOpt的用法
热门文章
- ChinaCock扫描控件介绍-使用TCCBarcodeScanner引起app闪退
- sql 存储过程笔记2
- linux获取保留yum源、并获取安装位置
- deep_learning_Function_ lambda函数详解
- Linux根文件系统和目录结构及bash特性2
- API开发之接口安全(一)----生成sign
- 调用libusb_control_transfer 出错,返回-8
- Python: 多进程的分布式进程multiprocessing.managers
- 如何使用Laravel Debugbar?
- 【杂题】cf1041fF. Ray in the tube